我有一个有几百行和26列的csv文件,但最后几列只有几行的值,它们朝向文件的中间或末尾。当我尝试使用read_csv()读取它时,我收到以下错误。 “ValueError:期待23列,第64行得到26”
我看不到在哪里明确说明文件中的列数,或者它如何确定它认为文件应该有多少列。 转储在
之下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 :(得分:28)
您可以使用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
希望它有所帮助。
答案 1 :(得分:5)
您还可以使用分隔符'^'加载CSV,将整个字符串加载到列,然后使用split将字符串分解为所需的分隔符。之后,您执行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)
答案 2 :(得分: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))}
然后您可以使用
将字典转换为数据框import pandas as pd
df = pd.DataFrame.from_dict(data)
答案 3 :(得分:0)
给定解决方案的问题是您必须知道所需的最大列数。我找不到这个问题的直接函数,但你可以写一个def,它可以:
这是我为我的文件写的def(函数):
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