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

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

ただいまの
回答率

90.34%

  • Python

    9155questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 278

rainrain

score 12

現在のプログラムの仕様

現在、以下のように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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rainrain

    2018/06/29 13:29

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

    キャンセル

  • sysjojo

    2018/06/29 13:30

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

    キャンセル

  • rainrain

    2018/06/29 14:33

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

    キャンセル

回答 2

checkベストアンサー

+1

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

import sys
import pandas as pd

if len(sys.argv) < 5:
    sys.exit()

input_file = sys.argv[1]
output_file = sys.argv[2]
m = int(sys.argv[3])
n = int(sys.argv[4])

df = pd.read_csv(input_file)
val1 = df.iloc[:,0].values
val2 = df.iloc[:,1].values

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 14:03 編集

    すごい理想の回答ありがとうございます!
    とても納得です!
    あと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様に余裕がありましたら、教えていただきたいです。

    キャンセル

  • 2018/06/29 14:09 編集

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

    キャンセル

  • 2018/06/29 15:13 編集

    遅くなりました

    途中の処理の詳細が不明の為、具体的に書くことはできないのですが、
    単にcsvファイルを作成したいのであれば、

    import csv

    f = open(output_file, "w")
    writer = csv.writer(f, lineterminator='\r\n')

    として for文の中で

    f.writerow(results) # (results は List形式です。)
    をするのが簡単ではないでしょうか。

    キャンセル

  • 2018/06/29 15:16

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

    キャンセル

  • 2018/06/29 15:55

    なるほど、、、
    せっかく教えていただいたのに、なかなか上手くいきませんでした。
    どうしても改行させずに表示したかったので、sys.stdout.writeを使ったのですが、それがよくなかったんですかね。
    最初は普通にprintしてたんですけど、それだと、



    のように表示されていたので、sys.stdout.writeにしてみると、
    1 2 3
    になったので、このようにしていたのですが、、、。
    a=val1[行数]
    sys.stdout.write((str)(*a)+ ", ")
    とせずに、pandasの関数を使って、output_fileに改行なしで書き込む方法ってありますでしょうか?
    本当にお手数をおかけします。

    キャンセル

  • 2018/06/29 16:38

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

    キャンセル

  • 2018/06/29 16: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行で書き出せばよいのではないでしょうか。

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9155questions

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