簡體   English   中英

表達式后的CVS writerow()

[英]CVS writerow() after expression

我一直無法重新生成一個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]])

文件是一個迭代器-您對其進行一次迭代,然后將其為空。

csv.reader也是一個迭代器。

通常,如果要重用迭代器,可以通過三種方法進行:

  1. 重新生成迭代器(並且,如果其源是迭代器,則也重新生成該迭代器,以此類推),在這種情況下,這意味着再次open文件。
  2. 使用itertools.tee
  3. 迭代器復制到一個序列和重復使用來代替。

在文件的特殊情況下,可以使用f.seek(0)偽造#1。 其他一些迭代器具有類似的行為。 但總的來說,您不應該依賴於此。

無論如何,最后一個是最簡單的,所以讓我們看看它是如何工作的:

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

現在,您已獲得文件中所有行的列表。 您可以復制,循環瀏覽,循環復制副本,關閉文件,再次循環復制副本,它仍然存在。

當然,不利的一面是,您需要足夠的內存才能將整個內容存儲在內存中(此外,您必須先閱讀完最后一行,才能開始處理第一行)。 如果存在問題,則需要重新組織代碼以使其只需要通過一次,或者重新打開(或seek )文件。

也許您需要這樣的東西?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM