2011-07-22 3 views
2

У меня есть следующий код:TypeError: ожидается, объект буфера символов

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) в каталоге, а затем вырезать определенный мусор из каждой ячейки (все после того, как и в том числе/т.)

+0

Почему именно вы не хотите обрабатывать 'listing [0]'? –

ответ

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.

В-третьих, эта версия фактически закрывает файлы.

+0

отлично! благодаря!! – user808545

2

str.split('\t', 1) является эквивалентом '\t'.split(1), который пытается разбить строку '\t' на non-string 1, который терпит неудачу. И не совсем понятно, что вы ожидаете от этого: вы повторяете r, а затем в теле этого цикла вы снова повторяете r (в понимании списка.) Вы вместо этого хотели сделать что-то вроде этого?

for row in r: 
    stuff = [item.split('\t', 1) for item in row] 
    print stuff 

(который до сих пор не делает много смысла, но, по крайней мере, что-то делает.)

Смежные вопросы