使用csv模块写入文件

时间:2015-01-08 08:15:18

标签: python csv null

我试图从csv文件中提取序列号(即公共汽车站的数量)并写入新的csv文件。这些系列号通常采用以下形式:"皇后街,巴士站 - 平台A3 [BT000998]"。我只需要括号括起来的内容。我发现有些情况下存在不需要的逗号(如上例所示),并且使用csv模块可以避免此类问题。为此,我编写了以下代码:

import csv
import re
fp = open(r'C:\data\input.csv')
fpw = open(r'C:\data\output.csv','w')
data = csv.reader(fp)
writer = csv.writer(fpw)


for row in data:
    line = ','.join(row)
    lst = line.split(',')
    try:
        stop = lst[11]   # find the location that contains stop number
        extr = re.search(r"\[([A-Za-z0-9_]+)\]", stop)  # extract stop number enclosed by brackets
        stop_id = str(extr.group(1))
        lst[11] = stop_id  # replace the original content with the extracted stop number
        writer.writerow(lst) # write in the output file (fpw)
    except Exception, e:  # this part is in case there is error such as AttributeError
        writer.writerow(row)

运行此代码后,虽然没有引发错误,但只生成一个空的csv文件。我对python很新。非常感谢任何人都可以帮助我使用此代码来使其工作。

提前谢谢你。 随

==== UPDATE ====

根据大家的回复,我修改了以下代码:

import csv
import re
fp = r'C:\data\input.csv'
fpw = r'C:\data\output.csv'

with open(fp, 'rb') as input, open(fpw, 'wb') as output:
               for row in csv.reader(input):
                   try:
                       stop = row[11]
                       extr = re.search(r"\[([A-Za-z0-9_]+)\]", stop)
                       stop_id = str(extr.group(1))
                       row[11] = stop_id
                       repl_row = ','.join(row) + '\n'
                       output.write(repl_row)
                   except csv.Error:
                       pass

现在运行代码似乎有效。但是,在运行过程中,错误行包含NULL字节'虽然我添加了try / except,但是如上所示,python已经被提升了。所以任何人都有建议处理这个问题并让代码继续下去?顺便说一句,我正在处理的csv文件超过2GB。

非常感谢,Sui

1 个答案:

答案 0 :(得分:0)

如果这是整个代码,则在完成所有fpw.close()操作后,您需要使用writer关闭该文件。

您还可以尝试with关键字,如official Python documentation