这个处理.csv的Python程序有什么问题?
我有一个文本文件,里面列了一些字符串。
我想在一个.csv文件中查找那些以这些字符串开头的行,然后把它们放到一个新的.csv文件里。
在这个例子中,文本文件叫做'output.txt',原始的.csv文件叫'input.csv',而新的.csv文件叫'corrected.csv'。
代码如下:
import csv
file = open('output.txt')
while 1:
line = file.readline()
writer = csv.writer(open('corrected.csv','wb'), dialect = 'excel')
for row in csv.reader('input.csv'):
if not row[0].startswith(line):
writer.writerow(row)
writer.close()
if not line:
break
pass
出现的错误:
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 9, in <module>
writer.writerow(row)
TypeError: 'str' does not support the buffer interface`
新的错误:
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte
问题是这个CSV文件是用制表符保存的,而不是用逗号,现在的新问题是:
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 13, in <module>
if row[0] not in lines:
IndexError: list index out of range
这个CSV文件有500多个数据条目……这会有影响吗?
4 个回答
0
你最近遇到的问题:
if row[0] not in lines:
IndexError: list index out of range
错误信息提到了一个列表索引。
这里提到的索引只有一个可能,就是 0
。
如果 0
超出了范围,那就说明 len(row)
必须是零。
如果 len(row)
是零,那输入文件中对应的那一行就一定是空的。
如果输入文件中的一行是空的,你想怎么处理呢:
(a) 完全忽略这一行输入?
(b) 报一个(致命的)错误?
(c) 在某个地方记录一个错误信息,然后继续?
(d) 其他的处理方式?
2
这个 csv.reader
不能直接打开文件,它需要一个文件对象。更好的解决办法是这样的:
import csv
lines = []
with open('output.txt', 'r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
for row in reader:
if row[0] not in lines:
writer.writerow(row)
6
如果你查看一下文档,你会看到reader
是这样初始化的:
spamReader = csv.reader(open('eggs.csv', 'r'), ...
注意到open('eggs.csv', 'rb')
这部分吗?你在第9
行没有传入一个file
句柄,所以str
被当作文件句柄来处理,这就导致了错误。
把第9
行替换成这样:
csv.reader(open('input.csv', 'r', newline = ''))