Python 3中用户指定的csv读取和打印

Python 3中用户指定的csv读取和打印,python,csv,python-3.x,Python,Csv,Python 3.x,我有一个脚本,它应该读入位于同一目录中的用户指定的2列csv文件,对数据进行一些计算,并将结果打印到另一个用户定义的csv文件stdout。我是在2.7.5版本中完成的,但现在我终于转到了3.2版本,它不起作用了。我知道这并不令人震惊,但我在编程方面非常缺乏经验,而且我在解决如何在Python3中工作时遇到了困难 我已经将代码剥离回了它以前工作的基本读取和打印元素,但它在3.2中仍然不能工作,尽管做了一些更明显的修改,它只是卡住了,永远不会打印到新文件。我尝试过使用2to3.py,但它抛出了一个

我有一个脚本,它应该读入位于同一目录中的用户指定的2列csv文件,对数据进行一些计算,并将结果打印到另一个用户定义的csv文件stdout。我是在2.7.5版本中完成的,但现在我终于转到了3.2版本,它不起作用了。我知道这并不令人震惊,但我在编程方面非常缺乏经验,而且我在解决如何在Python3中工作时遇到了困难

我已经将代码剥离回了它以前工作的基本读取和打印元素,但它在3.2中仍然不能工作,尽管做了一些更明显的修改,它只是卡住了,永远不会打印到新文件。我尝试过使用2to3.py,但它抛出了一个错误的输入解析,没有做任何更改!我宁愿确切地知道为什么它现在不起作用

我想要的命令类型是

somedirectory>myscript inputdata.csv > outputdata.csv
这里是Python2.7.5脚本的精简版本,可以让您看到我在做什么(我在所有导入中都留下了)

将fileinput、math、sys、numpy导入为np
从numpy导入linspace、loadtxt、one、convolve
从optpasse导入OptionParser
def main():
parser=OptionParser()
选项,args=parser.parse_args()
尝试:
data=[(line.rstrip()).split(','),用于fileinput.input(args)中的行]
除IOError外,详情如下:
打印>>sys.stderr,详细信息
系统出口(2)
''保留这些行只是为了确保数据与以前工作时的格式相同''
t=[float(行[0])表示数据中的行]
m=[float(行[1])表示数据中的行]
结果=[[a,b]对于zip中的a,b(t,m)]
对于行输入结果:
打印>>sys.stdout,str(第[0]行)+','+str(第[1]行)
选项=0
如果名称=“\uuuuu main\uuuuuuuu”:
main()
显然,Print现在是一个函数,不推荐使用的Optparse可以转换为Argparse等

所以我觉得像这样的事情会很好

导入fileinput、math、sys、inspect、numpy作为np
从numpy导入linspace、loadtxt、one、convolve
从argparse导入ArgumentParser
def main():
parser=ArgumentParser()
选项,args=parser.parse_args()
尝试:
data=[(line.rstrip()).split(','),用于fileinput.input(args)中的行]
除IOError外,详情如下:
打印(详细信息,文件=sys.stderr)
系统出口(2)
''保留这些行只是为了确保数据与以前工作时的格式相同''
t=[float(行[0])表示数据中的行]
m=[float(行[1])表示数据中的行]
结果=[[a,b]对于zip中的a,b(t,m)]
对于行输入结果:
打印(str(第[0]行)+','+str(第[1]行),file=sys.stdout)
选项=0
如果名称=“\uuuuu main\uuuuuuuu”:
main()
这可能有一些明显的问题,但在研究了所有的元素后,我发现它到底在哪里断裂了

此外,可能还有更好的方法来读取和写入这种类型的csv文件,我只是坚持这样做,因为我知道它确实有效。例如,我知道csv模块,但是我在命令行中找不到任何在用户指定的文件上使用它的示例,比如我如何需要它,我能找到的所有示例都定义了要在脚本本身中打开的文件


提前谢谢。

代码之前的几件事。如果使用
argparse
模块,则必须指定它必须接收文件名作为输入。这就是我对
add\u参数所做的操作。由于参数不是可选的,因此如果用户未指定文件名,应用程序将退出

如果用户指定了文件名,我将尝试打开它并创建一个csv读取器。csv阅读器只是一个迭代器,它解析文件,这样我就可以遍历每一行,然后填充结果列表。填充列表后,应用程序将遍历列表,打印出所有元素<代码>尝试/例外
是否存在任何错误

import io
import csv
import argparse

def main():
    # Create the parser
    parser = argparse.ArgumentParser()
    parser.add_argument('filename', help='Name of the file you want to load')
    args = parser.parse_args()

    result = []
    with io.open(args.filename, 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            result.append([row[0], row[1]])

    for item in result:
        print('{0}, {1}'.format(*item))

if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print('Something went wrong {0}'.format(e))

main
工作,只需更改
打印

def main():
    parser = OptionParser()
    options,args = parser.parse_args()
    try:
        data = [(line.rstrip()).split(',') for line in fileinput.input(args)]
    except IOError as detail:
        print(detail, file=sys.stderr)
        sys.exit(2)

    '''kept these lines in just to make sure the data is in the same format as when it worked before'''
    t = [float(row[0]) for row in data]
    m = [float(row[1]) for row in data]
    result = [[a,b] for a,b in zip(t, m)]

    for line in result:
        print(', '.join(str(x) for x in line), file=sys.stdout)

您没有从第二个版本中获得任何信息的原因是
sys.exit(2)

它退出而不转到正常输出

更正argparse(允许1个或多个输入文件):

或者,您可以让
argparse
负责打开文件(并在需要时引发错误):


FileType
还将
'-'
识别为
stdin
(或者对于
('w')
文件,
stdout

谢谢,这看起来更像是应该怎么做的!然而,我似乎无法让这个代码工作。如果我不使用argparse并将io.open()中的对象更改为特定的文件名,则运行正常,但当我使用上述方法时,在命令行中使用上述格式的命令时,会得到“error:to now arguments”。它应该工作,因为它与使用状态的格式相同。事实上,无论我如何尝试,它似乎都无法识别我调用的任何输入文件。您应该如何调用命令中的输入文件?您不必更改任何内容,只需将其保存到
myscript.py
,并按照您在问题中所述进行调用:
python myscript.py inputdata.csv>outputdata.csv
谢谢,玩了一会儿我也发现了这一点。那不是我说的命令。使用旧代码,我会将目录更改为脚本和csv的位置,
CD C:\somedirectory
,然后键入命令
myscript inputdata.csv>outputdata.csv
。现在,我需要指定“python”和python脚本的扩展,这并不完全是我想要的,但至少它现在可以工作了!你是在linux还是windows上?你能用sys.exit(2)复制
echo%PATHEXT%
的输出吗?对不起,这只是我问题中的格式错误,在我运行的实际脚本中是正确的。谢谢你的回答,虽然根据我对维克多的回复,这些似乎仍然不起作用,可能是我的目的出了问题!如果我用第一个v
except IOError as detail:
    print(detail, file=sys.stderr)
sys.exit(2)
def main():
    parser = ArgumentParser()
    parser.add_argument('infiles',nargs='+')
    args = parser.parse_args()
    try:
        data = [(line.rstrip()).split(',') for line in fileinput.input(args.infiles)]
    except IOError as detail:
        print(detail, file=sys.stderr)
        sys.exit(2)

    '''kept these lines in just to make sure the data is in the same format as when it worked before'''
    t = [float(row[0]) for row in data]
    m = [float(row[1]) for row in data]
    result = [[a,b] for a,b in zip(t, m)]

    for line in result:
        print(', '.join(str(x) for x in line))
import argparse
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infiles',nargs='+', type=argparse.FileType('r'))
    args = parser.parse_args()
    data = [row for file in args.infile for row in csv.reader(file)]

    '''kept these lines in just to make sure the data is in the same format as when it worked before'''
    t = [float(row[0]) for row in data]
    m = [float(row[1]) for row in data]
    result = [[a,b] for a,b in zip(t, m)]

    for line in result:
        print(', '.join(str(x) for x in line))