web-dev-qa-db-ja.com

TypeError:Unicodeへの強制:文字列またはバッファが必要、リストが見つかりました

データ解析スクリプトを起動して実行しようとしています。データ操作に関する限り機能します。私がやろうとしているのは、これをセットアップして、1つのコマンドで複数のユーザー定義CSVを入力できるようにすることです。

例えば.

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

出力CSVの命名を自動化する方法についてアドバイスがある場合は、input = test.csvoutput = 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("%")])

エラーの原因がよくわかりません。誰かがこれを素人の言葉で説明できますか?

私はプログラミング/ Python全体としては初心者で、基本的に一人で学習しているので、できれば何が悪いのか/どのように修正するかを説明して、今後の参考のために書き留めてください。

11
user3234810

_args.infile_はファイル名のリストであり、1つのファイル名ではありません。それをループする:

_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_を追加して新しい出力ファイル名を生成できます。

12
Martijn Pieters

.add_argumentnargs引数を指定すると、引数は常にリストとして返されます。

指定したすべてのファイルを処理する場合は、そのリストをループ処理します。

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

            #to skip empty cells
[...]

または、本当に単一のファイルを指定できるようにしたい場合。 nargs="+"を取り除くだけです。

2
Wooble