0

我无法 re.sub 一个 csv 文件。我的表达正在做它的工作,但作家是我卡住的地方。

re.sub                   out
"A1","Address2"          "A1","Address2"
0138,"DEERFIELD AVE"     0138,"DEERFIELD"
0490,"REMMINGTON COURT"  0490,"REMMINGTON"
2039,"SANDHILL DR"       2039,"SANDHILL"

import csv
import re

with open('aa_street.txt', 'rb') as f:
    reader = csv.reader(f)
    read=csv.reader(f)  
    for row in read:
        row_one = re.sub('\s+(DR|COURT|AVE|)\s*$', ' ', row[1])
        row_zero = row[0]
        print row_one

    for row in reader:
        print writerow([row[0],row[1]])
4

2 回答 2

2

也许这样的东西是你需要的?

#!/usr/local/cpython-3.3/bin/python

# "A1","Address2"          "A1","Address2"
# 0138,"DEERFIELD AVE"     0138,"DEERFIELD"
# 0490,"REMMINGTON COURT"  0490,"REMMINGTON"
# 2039,"SANDHILL DR"       2039,"SANDHILL"

import re
import csv

with open('aa_street.txt', 'r') as infile, open('actual-output', 'w') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        row_zero = row[0]
        row_one = re.sub('\s+(DR|COURT|AVE|)\s*$', '', row[1])
        writer.writerow([row_zero, row_one])
于 2013-11-06T21:44:03.433 回答
2

一个文件是一个迭代器——你迭代它一次,然后它就为空了。

Acsv.reader也是一个迭代器。

一般来说,如果你想重用一个迭代器,有以下三种方法:

  1. 重新生成迭代器(并且,如果它的源是一个迭代器,也重新生成它,以此类推)——在这种情况下,这意味着open文件再次。
  2. 使用itertools.tee.
  3. 将迭代器复制到一个序列中并重用

在文件的特殊情况下,您可以使用f.seek(0). 其他一些迭代器也有类似的行为。但总的来说,你不应该依赖这个。

无论如何,最后一个是最简单的,所以让我们看看它是如何工作的:

reader = list(csv.reader(f))
read = reader

现在您已经获得了文件中所有行的列表。你可以复制它,循环它,循环复制,关闭文件,再次循环复制,它仍然存在。

当然,不利的一面是您需要足够的内存才能将整个内容放入内存中(另外,在读完最后一行之前,您无法开始处理第一行)。如果这是一个问题,您需要重新组织代码使其只需要一次通过,或者重新打开(或seek)文件。

于 2013-11-06T21:30:58.670 回答