【问题标题】:TypeError: coercing to Unicode: need string or buffer, list foundTypeError:强制转换为 Unicode:需要字符串或缓冲区,找到列表
【发布时间】:2014-03-02 01:29:45
【问题描述】:

我正在尝试启动并运行数据解析脚本。就数据操作而言,它可以工作。我要做的是设置它,以便我可以使用单个命令输入多个用户定义的 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 整体的新手,基本上是独自学习,所以如果可能的话,您能否解释一下出了什么问题/如何解决它,以便我记下它以供将来参考。

【问题讨论】:

  • 谢谢!还是新的:/

标签: python python-2.7 argparse


【解决方案1】:

args.infile 是一个list 文件名,而不是一个文件名。循环它:

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 添加到基本文件名中。

【讨论】:

  • 谢谢!甚至不知道操作系统模块
【解决方案2】:

如果您将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="+"

【讨论】:

  • 我希望指定多个文件,基本上是一个突变列表。
  • 是的;在这种情况下,您需要像我展示的那样遍历所有文件名。
  • 谢谢!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2015-02-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多