如何迭代目录中的文件?

时间:2014-12-11 19:45:04

标签: python file iteration

我已经阅读了其他答案,但似乎我仍在某处犯错。

我想处理给定目录中的所有csv文件。

def main(): 
    data = []

    for root, dir, files in os.walk('/Users/me/Documents/ssbm csv/ssbm_stats/'):

        for name in files:

            # only csv files
            if name.endswith(".csv"):

                csvpath = os.path.join(root, name)
                c = csv.reader(csvpath)
                print "processing:", csvpath

                games = makeT(c)

它运行但它做错了。它不会使用csv.reader()打开csv文件。

def makeT(csvfile):
    for row in csvfile:
        print csvfile
        print row
        print len(row)

输出:

<_csv.reader object at 0x10d3ecde0>
['/']
1

长度错了。 csv文件的任何部分都没有斜杠字符;所以我认为它可能是用文件名做的事情。我真的不明白为什么它没有正确传递文件。

如何将文件名传递给csv.reader()

2 个答案:

答案 0 :(得分:2)

您需要将实际打开的文件传递给csv.reader

with open(csvpath, 'rb') as csvfile:
    c = csv.reader(csvfile)
    ...

答案 1 :(得分:1)

来自文档

  

csv.reader(csvfile,dialect ='excel',** fmtparams)

     

返回一个读取器对象,它将迭代给定csvfile中的行。 csvfile可以是任何支持迭代器协议的对象,并且每次调用next()方法时都返回一个字符串 - 文件对象和列表对象都是合适的。

在您的情况下,第一个参数必须是打开的文件

它可以枯萎

csvfile = open(csvpath, 'rb') 
reader = csv.reader(csvfile)

with open(csvpath, 'rb') as csvfile:
    reader = csv.reader(csvfile)

但第二种是首选,因为它会自动关闭文件。

csvreader对象的其他参数可以包括delimeterquotechar