2017-08-29 99 views
4

所以我已經看到這樣做是其他問題在這裏問,但我仍然有點困惑。過去幾天我一直在學習python3,並認爲我會開始一個項目的工作,以便讓我的手變得骯髒。我需要遍歷一定數量的CSV文件並對這些文件進行編輯。我在進入一個特定的列時也遇到了麻煩,並且一般情況下也出現了python中的循環。我習慣於約定(int i = 0;我<表達式; i ++),但在python中有點不同。這是我的代碼到目前爲止,我會解釋我的問題在哪裏。Python通過CSV文件和它們的列循環

import os 
import csv 

pathName = os.getcwd() 

numFiles = [] 
fileNames = os.listdir(pathName) 
for fileNames in fileNames: 
    if fileNames.endswith(".csv"): 
     numFiles.append(fileNames) 

for i in numFiles: 
    file = open(os.path.join(pathName, i), "rU") 
    reader = csv.reader(file, delimiter=',') 
    for column in reader: 
     print(column[4]) 

我的問題就落在這條線:

for column in reader: 
     print(column[4]) 

所以在文檔它說,一列是可變的,讀者就是我通過循環。但是當我寫4我得到這個錯誤:

IndexError: list index out of range 

這是什麼意思?如果我寫入0而不是4,則會打印出每個CSV文件的第0列單元格0中的所有值。我基本上需要它通過每個CSV文件的第一行,找到一個特定的值,然後遍歷整個列。提前致謝!

+5

這意味着在您的某個文件的某處沒有第5列。 –

+0

'閱讀器列'?這不是'在閱讀器中排'嗎?不要忘記使用'with'來確保文件在進程結束後關閉:'open(os.path.join(pathName,i),「rU」)作爲文件:' – jferard

+0

太棒了,感謝所有人答案! @azalea爲什麼是5?我試圖理解這個for循環是如何工作的。 – humbleCoder

回答

2

這可能是因爲您的.csv文件中沒有5列。

Python是base0,這意味着它開始從0開始計數,所以第一列將是列[0],第二列將是列[1]。你

可能還需要通過行,而不是列我的理解改變你

​​3210

for row in reader: 

因爲讀者迭代。

此代碼循環遍歷每行,然後循環該行中的每一列,以便查看每個單元格的內容。

for i in numFiles: 
    file = open(os.path.join(pathName, i), "rU") 
    reader = csv.reader(file, delimiter=',') 
    for row in reader: 
     for column in row: 
      print(column) 
      if column=="SPECIFIC VALUE": 
       #do stuff 
+0

是的,我需要閱讀更多的文檔。現在我明白髮生了什麼,謝謝!我真的很喜歡你和Doron Cohen的回答。 – humbleCoder

3

歡迎來到Python!我建議你打印一些調試信息。

你可以添加這個給你打印循環:

for row in reader: 
    try: 
     print(row[4]) 
    except IndexError as ex: 
     print("ERROR: %s in file %s doesn't contain 5 colums" % (row, i)) 

這將打印錯誤行(如列表,因爲這是他們如何在CSVReader表示),所以你可以修復的CSV文件。

一些注意事項:

  1. 這是常見的Python中使用snake_case而不是camelCase
  2. 名稱的變量適當(csv_filename而不是irow代替column等)
  3. 使用with接近處理文件(read more

享受!

+0

是的!謝謝!我完全忘了調試信息......我多麼愚蠢。是的,我很習慣camelCase,但我會切換到snake_case。謝謝!我非常喜歡你和Philip556677的回答。 – humbleCoder