表达后的CVS writerow()

时间:2013-11-06 21:19:58

标签: python regex csv

我无法重新发送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]])

2 个答案:

答案 0 :(得分:2)

文件是一个迭代器 - 你迭代它一次,然后它就是空的。

csv.reader也是一个迭代器。

通常,如果要重用迭代器,有三种方法:

  1. 重新生成迭代器(如果它的源是一个迭代器,也会重新生成它,就像链上一样) - 在这种情况下,这意味着再次open该文件。
  2. 使用itertools.tee
  3. 将迭代器复制到一个序列中,然后重新使用
  4. 在文件的特殊情况下,您可以使用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])