我有以下代码:
import os
import csv
listing = os.listdir('/directory/my/files/are/in')
os.chdir('/directory/my/files/are/in')
for file in listing[1:]:
r = csv.reader(open(file, 'rU'))
for row in r:
stuff = [str.split('\t', 1) for row in r]
print stuff
返回TypeError: expected a character buffer object
。我该如何解决?基本上我想打开目录中的所有(csv)文件,然后从每个单元格中删除某些垃圾(包括/ t后的所有内容)。
答案 0 :(得分:2)
str.split('\t', 1)
相当于'\t'.split(1)
,它试图将字符串'\t'
拆分为非字符串1
,但失败了。并不完全清楚你期望这样做:你正在迭代r
,然后在那个循环体中你再次迭代r
(在列表理解中)。你有没有相反意味着做这样的事情?
for row in r:
stuff = [item.split('\t', 1) for item in row]
print stuff
(这仍然不会让很多感觉,但至少它会做点什么。)
答案 1 :(得分:1)
import os
import csv
listing = os.listdir('/directory/my/files/are/in')
os.chdir('/directory/my/files/are/in')
for file in listing[1:]:
if os.path.isdir(file):
continue
with open(file, 'rU') as csvfile:
for row in csv.reader(csvfile, delimiter='\t'):
print row
#now you can extract data from the row
这解决了几个问题。
首先,您需要确保尝试打开的每个文件实际上是一个文件,而不是目录。
其次,csv.reader
可以使用制表符作为分隔符。这意味着您无需使用split
。
第三,这个版本实际上会关闭文件。