这个处理.csv的Python程序有什么问题?

1 投票
4 回答
5194 浏览
提问于 2025-04-17 04:46

我有一个文本文件,里面列了一些字符串。

我想在一个.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 = ''))

撰写回答