2017-08-29 98 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