我已经阅读了其他答案,但似乎我仍在某处犯错。
我想处理给定目录中的所有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()
?
答案 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
对象的其他参数可以包括delimeter
和quotechar