2013-11-22 4 views
12

У меня есть файл csv, который содержит несколько сотен строк и 26 столбцов, но последние несколько столбцов имеют значение в несколько строк, и они находятся в середине или конец файла. Когда я пытаюсь прочитать его при использовании read_csv(), я получаю следующую ошибку. «ValueError: ожидающий 23 столбца, получил 26 в строке 64»Pandas read_csv ожидает ошибочное число столбцов, с оборванным файлом csv

Я не вижу, где явно указывать количество столбцов в файле или как он определяет, сколько столбцов он считает файлом. Свалка находится ниже

In [3]: 

infile =open(easygui.fileopenbox(),"r") 
pledge = read_csv(infile,parse_dates='true') 


--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-3-b35e7a16b389> in <module>() 
     1 infile =open(easygui.fileopenbox(),"r") 
     2 
----> 3 pledge = read_csv(infile,parse_dates='true') 


C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in read_csv(filepath_or_buffer, sep, dialect, header, index_col, names, skiprows, na_values, thousands, comment, parse_dates, keep_date_col, dayfirst, date_parser, nrows, iterator, chunksize, skip_footer, converters, verbose, delimiter, encoding, squeeze) 
    234   kwds['delimiter'] = sep 
    235 
--> 236  return _read(TextParser, filepath_or_buffer, kwds) 
    237 
    238 @Appender(_read_table_doc) 

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in _read(cls, filepath_or_buffer, kwds) 
    189   return parser 
    190 
--> 191  return parser.get_chunk() 
    192 
    193 @Appender(_read_csv_doc) 

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in get_chunk(self, rows) 
    779    msg = ('Expecting %d columns, got %d in row %d' % 
    780     (col_len, zip_len, row_num)) 
--> 781    raise ValueError(msg) 
    782 
    783   data = dict((k, v) for k, v in izip(self.columns, zipped_content)) 

ValueError: Expecting 23 columns, got 26 in row 64 
+0

Спасибо, Роман, я был посредине выяснения, как сделать его более читаемым, и вы избили меня до него. :) – chrisfs

+1

np, о вашем вопросе, у вас есть заголовок в вашем файле? –

+0

Нет, нет заголовка, похоже на то, или ответ ниже будет способом. – chrisfs

ответ

23

Вы можете использовать names параметр. Например, если у вас есть CSV-файл, как это:

1,2,1 
2,3,4,2,3 
1,2,3,3 
1,2,3,4,5,6 

И попробуйте прочитать его, вы будете получать и ошибку

>>> pd.read_csv(r'D:/Temp/tt.csv') 
Traceback (most recent call last): 
... 
Expected 5 fields in line 4, saw 6 

Но если вы передаете names параметры, вы получите результат:

>>> pd.read_csv(r'D:/Temp/tt.csv', names=list('abcdef')) 
    a b c d e f 
0 1 2 1 NaN NaN NaN 
1 2 3 4 2 3 NaN 
2 1 2 3 3 NaN NaN 
3 1 2 3 4 5 6 

Надеюсь, это поможет.

0

Предположим, у вас есть файл, как это:

a,b,c 
1,2,3 
1,2,3,4 

Вы можете использовать csv.reader очистить файл первый,

lines=list(csv.reader(open('file.csv')))  
header, values = lines[0], lines[1:]  
data = {h:v for h,v in zip (header, zip(*values))} 

и получите:

{'a' : ('1','1'), 'b': ('2','2'), 'c': ('3', '3')} 

Если вы нет заголовка, который вы могли бы использовать:

data = {h:v for h,v in zip (str(xrange(number_of_columns)), zip(*values))} 

, а затем вы можете конвертировать словарь в dataframe с

import pandas as pd 
df = pd.DataFrame.from_dict(data) 
+0

, если у вас есть строка заголовка, вы можете использовать csv.DictReader – Tjorriemorrie

4

вы также можете загрузить CSV с разделителем «^», чтобы загрузить всю строку в столбце, а затем использовать раскол сломать строка в требуемые разделители. После этого вы выполняете concat для объединения с исходным фреймворком данных (при необходимости).

temp=pd.read_csv('test.csv',sep='^',header=None,prefix='X') 
temp2=temp.X0.str.split(',',expand=True) 
del temp['X0'] 
temp=pd.concat([temp,temp2],axis=1) 
0

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

  1. читать все строки
  2. расколоть его
  3. подсчитать количество слов/элементы в каждой строке
  4. магазин максимальное количество слов/элементов
  5. место, максимальное значение в опции имен (как это было предложено Roman Pekar)

Здесь это def (function), который я написал для своих файлов:

def ragged_csv(filename): 
    f=open(filename) 
    max_n=0 
    for line in f.readlines(): 
     words = len(line.split(' ')) 
     if words > max_n: 
      max_n=words 
    lines=pd.read_csv(filename,sep=' ',names=range(max_n)) 
    return lines 
+0

В моем конкретном случае я знал максимальное количество столбцов, но это может быть полезно, если вы используете внешние данные, где это не доступно сразу. – chrisfs