TypeError: приведение к Unicode: нужна строка или буфер, найден список

Я пытаюсь запустить скрипт анализа данных. Это работает, насколько это касается манипулирования данными. То, что я пытаюсь сделать, это настроить это, чтобы я мог вводить несколько CSV, определенных пользователем, с помощью одной команды.

e.g.

> python script.py One.csv Two.csv Three.csv 

Если у вас есть какие-либо советы о том, как автоматизировать именование выходного CSV, чтобы, если input = test.csv, output = test1.csv, я тоже был бы признателен.

Получающий

TypeError: coercing to Unicode: need string or buffer, list found

для линии

for line in csv.reader(open(args.infile)):

Мой код:

import csv
import pprint
pp = pprint.PrettyPrinter(indent=4)
res = []

import argparse
parser = argparse.ArgumentParser()

#parser.add_argument("infile", nargs="*", type=str)
#args = parser.parse_args()

parser.add_argument ("infile", metavar="CSV", nargs="+", type=str, help="data file") 
args = parser.parse_args()


with open("out.csv","wb") as f:
    output = csv.writer(f) 
    for line in csv.reader(open(args.infile)): 
        for item in line[2:]:

            #to skip empty cells
            if not item.strip():
                continue

            item = item.split(":")
            item[1] = item[1].rstrip("%")

            print([line[1]+item[0],item[1]])
            res.append([line[1]+item[0],item[1]])
            output.writerow([line[1]+item[0],item[1].rstrip("%")])

Я не очень понимаю, что происходит с ошибкой. Кто-нибудь может объяснить это по-человечески?

Имейте в виду, что я новичок в программировании/питоне в целом и в основном учусь один, поэтому, если возможно, вы могли бы объяснить, что происходит не так/как это исправить, чтобы я мог отметить это для дальнейшего использования.


person user3234810    schedule 05.02.2014    source источник
comment
Благодарю вас! еще новый :/   -  person user3234810    schedule 05.02.2014


Ответы (2)


args.infile – это список имен файлов, а не одно имя файла. Цикл над ним:

for filename in args.infile:
    base, ext = os.path.splitext(filename)
    with open("{}1{}".format(base, ext), "wb") as outf, open(filename, 'rb') as inf:
        output = csv.writer(outf) 
        for line in csv.reader(inf): 

Здесь я использовал os.path.splitext(), чтобы разделить расширение и базовое имя файла, чтобы вы могли сгенерировать новое имя выходного файла, добавив 1 к базе.

person Martijn Pieters    schedule 05.02.2014
comment
Благодарю вас! даже не знал про модуль ОС - person user3234810; 05.02.2014

Если вы укажете аргумент nargs для .add_argument, аргумент всегда будет возвращаться в виде списка.

Предполагая, что вы хотите иметь дело со всеми указанными файлами, выполните цикл по этому списку:

for filename in args.infile:
    for line in csv.reader(open(filename)): 
        for item in line[2:]:

            #to skip empty cells
[...]

Или, если вы действительно просто хотите указать один файл; просто избавьтесь от nargs="+".

person Wooble    schedule 05.02.2014
comment
Я хочу указать несколько файлов, в основном это список мутаций. - person user3234810; 05.02.2014
comment
Ага; в этом случае вам нужно перебрать все имена файлов, как я показал. - person Wooble; 05.02.2014
comment
Благодарю вас! очень признателен! - person user3234810; 05.02.2014