2010-07-12 150 views
0

我正在多次讀取csv文件,但每次經過它時都會縮小其大小。所以,一旦我到達底部,我正在編寫一個新的csv文件,即.csv文件的下半部分。然後,我希望將csv閱讀器改爲使用這個新文件,但它似乎沒有工作......這就是我所做的。切換文件以從python的.csv閱讀器中讀取

    sent = open(someFilePath) 
        r_send = csv.reader(sent) 
        try: 

         something = r_send.next() 

        except StopIteration: 
         sent.seek(0) 
         sent.close() 
         newFile = cutFile(someFilePath, someLineNumber) 
         sent = open(newFile, "r") 
         r_send = csv.reader(sent) 

其中cutFile呢..

def cutFile(sender, lines): 
    sent = open(sender, "r") 
    new_sent = open(sender + ".temp.csv", "w") 
    counter = 0 

    for line in sent: 
     counter = counter + 1 
     if counter >= lines: 
      print >> new_sent, ",".join(line) 

    new_sent.close() 
    return sender + ".temp.csv" 

這是爲什麼不工作?

+0

什麼部分似乎沒有工作?你收到什麼錯誤信息?另外,你在某種循環中的代碼的頂部部分? – Wilduck 2010-07-12 17:27:56

回答

1
  1. something = r_send.next()在某種循環?你寫它的方式,它只會讀一行。
  2. 爲什麼你需要",".join(line)?你可以簡單地打印line本身,它應該工作。
  3. 另外,在關閉文件之前確實沒有必要使用seek(0)
+0

這些答案是@ ahhh的問題嗎?這似乎應該在我的評論中。 – Wilduck 2010-07-12 17:36:11

+0

@Wilduck - 我同意你的方式更具教育意義。關於你的問題: (1)是一個澄清。 (2)是實際答案(據我所知)。 (3)是關於代碼的一般觀察。 – adamk 2010-07-12 17:38:11

+0

然後好的表演。有一個upvote。 – Wilduck 2010-07-12 17:39:06

0

我建議如下:

使用for something in r_send:而非something = r_send.next();你甚至不需要try ... except塊,因爲你只需要把原始文件關閉到那個循環之外就可以了(就像其他人提到的那樣,你甚至不會循環當前代碼中的原始文件) 。那麼你可能想要把所有的東西包裝到另一個循環中,這樣它就會一直持續下去,直到文件被完全處理。使用new_sent.write(line)而不是print >> new_sent, ",".join(line)。並不是說除了",".join位(因爲您沒有使用csv模塊寫入文件,您並不需要它),它們在這裏不應該使用,但它使得事實上你正在寫一個更加明顯的文件。

所以......

sent = open(someFilePath) 
r_send = csv.reader(sent) 

someLineNumber = len(sent.readlines()) 

while someLineNumber > 0: 
    for something in r_send: 
     # do stuff 

    someLineNumber /= 2  # //= 2 in Python 3 

    sent.close() 
    newFile = cutFile(someFilePath, someLineNumber) 
    sent = open(newFile, "r") 
    r_send = csv.reader(sent) 

類似的東西。