TypeError:期望一个字符缓冲区对象

时间:2011-07-22 19:59:21

标签: python csv error-handling

我有以下代码:

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后的所有内容)。

2 个答案:

答案 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

第三,这个版本实际上会关闭文件。