我试图构建一个简单的click
命令行应用程序,以读取具有一种分隔符类型的文件,并用不同的分隔符写出相同的文件。我不想做find和replace之类的操作,因为列中可能有一些我不想接触的转义分隔符。在
我编写了一个简单的基于click的CLI来实现这一点,但是在传递\t
来创建一个制表符分隔的文件时遇到了一些问题。在
如下面的错误所示,制表符分隔符没有正确地传入pandas函数以写出新文件。当我在CLI中间打印出分隔符时,一切看起来都是正确的,所以我不确定这里发生了什么。在
import click
import pandas as pd
@click.command()
@click.argument('filename')
@click.argument('in_delimiter')
@click.argument('out_delimiter')
def cli(filename, in_delimiter, out_delimiter):
"""
Command line interface to change file delimiters
"""
# read in CSV file
df = pd.read_csv(filename, sep=in_delimiter)
print(len(df))
# write out CSV file
df.to_csv('output.csv', sep=out_delimiter, index=False)
print("transformation complete")
if __name__ == '__main__':
cli()
这是我将输入和输出分隔符传递到CLI的方式:
^{pr2}$这是生成的错误:
Traceback (most recent call last):
File "cli.py", line 24, in <module>
cli()
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/click/core.py", line 722, in __call__
return self.main(*args, **kwargs)
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/click/core.py", line 697, in main
rv = self.invoke(ctx)
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/click/core.py", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/click/core.py", line 535, in invoke
return callback(*args, **kwargs)
File "cli.py", line 19, in cli
df.to_csv('output.csv', sep=out_delimiter, index=False)
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/pandas/core/frame.py", line 1745, in to_csv
formatter.save()
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/pandas/io/formats/csvs.py", line 169, in save
self.writer = UnicodeWriter(f, **writer_kwargs)
File "/home/curtis/Program_Files/miniconda3/envs/py36/lib/python3.6/site-packages/pandas/io/common.py", line 521, in UnicodeWriter
return csv.writer(f, dialect=dialect, **kwds)
TypeError: "delimiter" must be a 1-character string
要处理转义字符,可以使用如下回调:
代码:
要使用回调,可以执行以下操作:
^{pr2}$这是如何工作的
这将使用
unicode_escape
编解码器处理传入的字符串。在(Source)
测试代码:
结果:
相关问题 更多 >
编程相关推荐