質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4281閲覧

コマンドラインでファイルと変数読み込み

rainrain

総合スコア31

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/29 03:37

###現在のプログラムの仕様

現在、以下のようにn行2列のcsvファイルを読み込んでいます。
2列のデータを1列ずつ扱いたかったので、このようにしています(おそらく上手なやり方でないのでしょうが、初心者なのでこうなっています)。

import pandas as pd
import sys
from sys import stderr

val1 = pd.read_csv('check.csv',usecols=[0]).values
val2 = pd.read_csv('check.csv',usecols=[1]).values

その後、使いたい値を2つ、

print('Please input [t1] : ',end='', file=stderr)
m = input('')
print('Please input [t2] : ',end='', file=stderr)
n = input('')

と、inputで端末から入力されるようにしています。

###やりたいこと(教えていただきたいこと)

上記でやっていることをコマンドラインで行いたいです。
端末で、

python a.py 入力ファイル名 出力ファイル名 値1 値2

と言った形で、1行で全てのことができるようにしたいのですがどうすればよいのでしょうか?
大変申し訳ないのですが、丁寧に教えていただけると助かります。

###自分で調べて分かっていること

ファイル読み込みは、

import sys
fp = open(sys.argv[1], 'r')
for line in fp.readlines():
print line
fp.close()

引数の取得は、

import sys
args = sys.argv
print(args)
print('第1引数:' + args[1])
print('第2引数:' + args[2])
print('第3引数:' + args[3])

で、できることは理解しました。
ただ、融合のさせ方が分かりません。
また、ファイルを読み込むのはいいのですが、最終的には上記で説明した通り、入力ファイルのデータを1列ずつ扱いたいのですが、その方法が分かりません。
これまでは以下のように、ファイルの読み込みと、usecols=[0]の処理を同時にやっていたのですが、コマンドラインバージョンでもできるのでしょうか?

val1 = pd.read_csv('check.csv',usecols=[0]).values

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysjojo

2018/06/29 03:51

入力で取ってくるn,mとファイルから取ってくるval1,val2は無関係?それともval1,val2を取る時のusercolsのパラメータ?やりたいこと、がよくわからないです。
rainrain

2018/06/29 04:25

無関係?ってことになるんですかね。簡単に言うと、読み込む範囲を指定するための値です。今、csvファイルを読み取って、特定の範囲のデータを取り出し、それを再びcsvファイルとして出力するというプログラムを作っています。二つの値は、どれくらいの範囲をとってくるかを決めるための値ですね。
sysjojo

2018/06/29 04:27

「python a.py 入力ファイル名 出力ファイル名 値1 値2」の値1が開始行、値2が終了行、みたいな感じですかね?
rainrain

2018/06/29 04:29

だいたいそんな感じです。
sysjojo

2018/06/29 04:30

YouheiSakuraiさんの回答でやりたいことを理解しました。ファイル名の指定をコマンドラインパラメータで他のパラメータの指定とセットでやりたい、ってことですね。失礼しました。
rainrain

2018/06/29 05:33

完全に知識不足からくる説明能力不足です。ご迷惑をおかけして大変申し訳ありません。
guest

回答2

0

ベストアンサー

こんな感じでよいのではないでしょうか

Python

1import sys 2import pandas as pd 3 4if len(sys.argv) < 5: 5 sys.exit() 6 7input_file = sys.argv[1] 8output_file = sys.argv[2] 9m = int(sys.argv[3]) 10n = int(sys.argv[4]) 11 12df = pd.read_csv(input_file) 13val1 = df.iloc[:,0].values 14val2 = df.iloc[:,1].values

投稿2018/06/29 04:27

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainrain

2018/06/29 05:04 編集

すごい理想の回答ありがとうございます! とても納得です! あと1つだけ質問させていただきたいのですが、 ファイルに出力する時は、 f = open("output_file","w") とかで大丈夫でしょうか? ファイルを読み込んだ後、for文で読み込む範囲の指定を行っています。 簡単に説明すると、 for i in range(~) 1列目に対する処理 a=val1[~] sys.stdout.write((str)(*a)+ ", ") for j in range(~)  2列目に対する処理   b=val2[~]         sys.stdout.write((str)(*b)+ ", ") 色々省略していますが、こんな感じです。 この2つのsys.stdout.writeの部分をoutout_fileに書き込みたいです。 これまでは、 python a.py > result.csv みたいな感じでやっていたので、よく分かりません。 前にprintでやってた時は、 print(*result, sep=', ',end="\r\n",file=f) みたいな感じで、最後にfile=fを入れたらできてたんですけど、 sys.stdout.write((str)(*b)+ ", ",file=f) ではできなくて悩んでいます。 もし、magichan様に余裕がありましたら、教えていただきたいです。
rainrain

2018/06/29 05:09 編集

なぜか2つ目のsys.stdout.writeのあたりがずれてしまっていて、変になっているのですが、b=val2[~]と同じく、for j in range(~)の中の処理です。 また2つのfor文が同じ並びになっていますが、本当はfor文の中にfor文を書いています。
magichan

2018/06/29 06:13 編集

遅くなりました 途中の処理の詳細が不明の為、具体的に書くことはできないのですが、 単にcsvファイルを作成したいのであれば、 import csv f = open(output_file, "w") writer = csv.writer(f, lineterminator='\r\n') として for文の中で f.writerow(results) # (results は List形式です。) をするのが簡単ではないでしょうか。
magichan

2018/06/29 06:16

ですが、私なら多分余程複雑では無い限り csvの読み出しから吐き出しまでを全て pandas 内で処理するかと思います
rainrain

2018/06/29 06:55

なるほど、、、 せっかく教えていただいたのに、なかなか上手くいきませんでした。 どうしても改行させずに表示したかったので、sys.stdout.writeを使ったのですが、それがよくなかったんですかね。 最初は普通にprintしてたんですけど、それだと、 1 2 3 のように表示されていたので、sys.stdout.writeにしてみると、 1 2 3 になったので、このようにしていたのですが、、、。 a=val1[行数] sys.stdout.write((str)(*a)+ ", ") とせずに、pandasの関数を使って、output_fileに改行なしで書き込む方法ってありますでしょうか? 本当にお手数をおかけします。
magichan

2018/06/29 07:38

スミマセン上のコメントでの回答に間違った記述が・・ f.writerow(results) の部分は writer.writerow(results) の間違いです。
magichan

2018/06/29 07:46

改行無し・・の方法に関しては、やはり具体的な処理の情報が無いとなんともです。 とりあえずループでの処理は results = [] for .. in ..: results.append(val) のようにリストに格納しておいて、ループを抜けた後に results の内容を一括で with open("output_file","w") as f writer = csv.writer(f, lineterminator='\r\n') writer.writerow(results) と1行で書き出せばよいのではないでしょうか。
guest

0

python

1from sys import argv 2nyuuryokufairumei, syuturyokufairumei, atai1, atai2 = argv[1:5]

の続きを書けば良いです。変数名は分かりやすいものに変えてもOKです。

投稿2018/06/29 04:07

編集2018/06/29 04:08
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問