2015-09-10 3 views
4

Использование Python 3.4 и Im пытается импортировать файлы csv с некоторыми запятыми, другие с запятой и другие, содержащие вкладки в качестве разделителей.python 3.4 import csv delimiter

Возможно ли, чтобы питон обнаружил, какой правильный разделитель использовать? Я прочитал сообщение на python: import csv file (delimiter “;” or “,”), но не могу получить соответствующий результат.

Мой код до сих пор:

import csv 

class Data(object): 
def __init__(self, csv_file): 
    self.raw_data = [] 
    self.read(csv_file) 

def read(self, csv_file): 
     with open(csv_file, newline='') as csvfile: 
      dialect = csv.Sniffer().sniff(csvfile.read(), delimiters=',;') 
      csvfile.seek(0) 
      f = csv.reader(csvfile, dialect) 
      for row in f: 
       self.raw_data.append(row) 
      print(self.raw_data) 

mycsv = Data('comma_separate.csv') 

comma_separate.csv содержит:

[email protected], $161,321, True, 1 
[email protected], $95.00, False, 3 
[email protected], $952025, False, 3 

Сейчас мой выход:

['[email protected], $161,321, True, 1'], ['[email protected], $95.00, False, 3'], ['[email protected], $952025, False, 3'] 

Мой желаемый результат:

['[email protected]', '$161,321', 'True', '1'], ['[email protected]', '$95.00', 'False', '3'], ['[email protected]', '$952025', 'False', '3'] 
+0

Это, возможно, помочь вам. [Чтение данных из-CSV-файла-и-преобразования-к правильному-типу данных] (http://stackoverflow.com/questions/11665628/read-data-from-csv-file-and-transform- to-correct-data-type) – luoluo

ответ

1

Проблема заключается в первой строке вашего csv-файла, которую вы используете для определения разделителя. Программа работает как и ожидалось, если вы измените строку:

[email protected], $161.321, True, 1 

Я предполагаю, что причина этого в том, что он хочет иметь одинаковое количество атрибутов в каждой строке в вашем CSV-файл.

0

использование сопение без прохождения возможных разделителей работает для меня

import csv 

class Data(object): 
    def __init__(self, csv_file): 
     self.raw_data = [] 
     self.read(csv_file) 

    def read(self, csv_file): 
      with open(csv_file, newline='') as csvfile: 
       dialect = csv.Sniffer().sniff(csvfile.read()) 
       csvfile.seek(0) 
       f = csv.reader(csvfile, dialect) 
       for row in f: 
        self.raw_data.append(row) 

       print(csvfile.name) 
       print(self.raw_data) 


for f in ['tab_separate.tsv','comma_separate.csv','comma_separate2.csv']: 
    mycsv = Data(f) 

выход

tab_separate.tsv 
[['[email protected]', '$161,321', 'True', '1'], ['[email protected]', '$95.00', 'False', '3'], ['[email protected]', '$952025', 'False', '3']] 
comma_separate.csv 
[['[email protected],', '$161,321,', 'True,', '1'], ['[email protected],', '$95.00,', 'False,', '3'], ['[email protected],', '$952025,', 'False,', '3']] 
comma_separate2.csv 
[['[email protected]', '$161,321', 'True', '1'], ['[email protected]', '$95.00', 'False', '3'], ['[email protected]', '$952025', 'False', '3']] 

вход запятая

[email protected], $161,321, True, 1 
[email protected], $95.00, False, 3 
[email protected], $952025, False, 3 

Вкладка вход

[email protected] $161,321 True 1 
[email protected] $95.00 False 3 
[email protected] $952025 False 3 

полу вход двоеточие

[email protected];$161,321;True;1 
[email protected];$95.00;False;3 
[email protected];$952025;False;3 
+0

Это странно. Я даже скопировал код, а также файл comma_separate.csv, и он все равно дает мне этот вывод: comma_separate.csv [['[email protected], $ 161,321, True, 1'], ['asafasf @ fafa. net, $ 95.00, False, 3 '], [' [email protected], $ 952025, False, 3 ']]' Вы также используете Python 3.4? – JanV123

+1

Да 3.4. снова посмотрев на это, я думаю, что мое разделяет пространство в файле, разделенном запятой, а не на запятую. т.е. он считает свой файл с разделителями пространства. Не могли бы вы загрузить где-нибудь вход csv? –

+0

https://drive.google.com/file/d/0BxeHWbvOxiOTYU15N200S3R4cVk/view?usp=sharing https://drive.google.com/file/d/0BxeHWbvOxiOTb1hSYTVaTl9oZUU/view?usp=sharing – JanV123