【问题标题】:CVS writerow() after expression表达式后的 CVS writerow()
【发布时间】:2013-11-06 21:19:57
【问题描述】:

我无法 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]])

【问题讨论】:

  • 你正试图从同一个文件中读取两次;该文件已经被read 读取,因此reader 将找不到更多行。
  • 你为什么编辑这个并且除了破坏格式/缩进什么都不做?

标签: python regex csv


【解决方案1】:

也许你需要这样的东西?

#!/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])

【讨论】:

    【解决方案2】:

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

    csv.reader 也是一个迭代器。

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

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

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

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

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

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

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

    【讨论】:

    • 为什么我可以使用 replace() 轻松遍历文件,但表达式 re.sub 不行?
    • @George:我不知道你这个问题是什么意思,或者它与你的主要问题或我的回答有什么关系。
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2019-03-06
    • 2017-05-02
    • 2015-12-18
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多