我无法重新发送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]])
答案 0 :(得分:2)
文件是一个迭代器 - 你迭代它一次,然后它就是空的。
csv.reader
也是一个迭代器。
通常,如果要重用迭代器,有三种方法:
open
该文件。itertools.tee
。在文件的特殊情况下,您可以使用f.seek(0)
伪造#1。其他一些迭代器具有类似的行为。但总的来说,你不应该依赖于此。
无论如何,最后一个是最简单的,所以让我们看看它是如何工作的:
reader = list(csv.reader(f))
read = reader
现在您已经获得了文件中所有行的列表。你可以复制它,循环它,循环复制,关闭文件,再次循环复制,它仍然存在。
当然,你需要足够的内存才能把整个内存放在内存中(另外,你不能开始处理第一行,直到你读完最后一行)。如果这是一个问题,您需要重新组织代码,使其只需要一次传递,或者重新打开(或seek
)文件。
答案 1 :(得分: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])