1

同じディレクトリにあるユーザー指定の 2 列の csv ファイルを読み取り、データに対していくつかの計算を行い、別のユーザー定義の csv ファイルである stdout に結果を出力するスクリプトがあります。私は 2.7.5 で作成しましたが、ようやく 3.2 に移行したばかりで、動作しません。私が知っているショックではありませんが、私はプログラミングにかなりの経験がなく、Python 3 で動作させる方法を理解するのに苦労しています.

以前は機能していた基本的な読み取り要素と印刷要素にコードを戻しましたが、より明白な変更をいくつか行ったにもかかわらず、3.2 ではまだ機能しません。2to3.py を使用してみましたが、不正な入力 parseerror が発生し、何も変更されません! とにかく、なぜ今それが機能しないのかを正確に学びたいと思います。

私が望むコマンドのタイプは次のとおりです。

somedirectory>myscript inputdata.csv > outputdata.csv

これは、私が何をしているのかを見ることができるように機能した Python 2.7.5 スクリプトの簡素化されたバージョンです (すべてのインポートを残しています)。

import fileinput, math, sys, numpy as np
from numpy import linspace, loadtxt, ones, convolve
from optparse import OptionParser

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 >> sys.stderr, detail
        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 >> sys.stdout, str(line[0]) + ',' + str(line[1])

options = 0
if __name__ == "__main__":
    main()

明らかに Print は関数になりました。廃止された Optparse は Argparse などに変換できます。

こんな感じでいいと思っていたので、

import fileinput, math, sys, inspect, numpy as np
from numpy import linspace, loadtxt, ones, convolve
from argparse import ArgumentParser

def main():
    parser = ArgumentParser()   
    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(str(line[0]) + ',' + str(line[1]), file=sys.stdout)

options = 0
if __name__ == "__main__":
    main()

これにはおそらくいくつかの明白な問題がありますが、すべての要素を調査した後、正確に壊れている場所に行き詰まっています.

さらに、このタイプのcsvファイルの読み取りと書き込みを行うためのより良い方法がおそらくあります. たとえばcsvモジュールについては知っていますが、必要な方法など、コマンドラインからユーザー指定のファイルでそれを使用する例を見つけることができません。見つけることができるすべての例は、スクリプト自体で開くファイルを定義しています。

前もって感謝します。

4

2 に答える 2

0

コードの前にいくつかのこと。モジュールを使用する場合はargparse、入力としてファイル名を受け取る必要があることを指定する必要があります。これは私がadd_argument. 引数はオプションではないため、ユーザーがファイル名を指定しない場合、アプリケーションは終了します。

ユーザーがファイル名を指定した場合、それを開いてcsvリーダーを作成しようとします。csv リーダーは、ファイルを解析する単なるイテレータであるため、すべての行を反復処理して、結果のリストにデータを入力できます。リストが作成されると、アプリケーションはリストを反復処理してすべての要素を出力します。try/except何か問題が発生した場合に備えてあります。

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))
于 2013-08-17T22:07:14.877 に答える
0

これmainは機能し、次を変更するだけprintです:

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)

2 番目のバージョンから何も得られない理由は、上のインデントです。sys.exit(2)

except IOError as detail:
    print(detail, file=sys.stderr)
sys.exit(2)

通常の出力に移行せずに終了します

argparse を修正 (1 つ以上の入力ファイルを許可):

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))

またはargparse、ファイルを開く処理を任せることもできます (必要に応じてエラーを発生させます)。

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))

FileTypeとしても認識'-'しますstdin(または('w')ファイルの場合stdout)

于 2013-08-18T01:08:01.773 に答える