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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

Q&A

解決済

5回答

3621閲覧

pythonでのファイルへの書き込みについて

aaa12

総合スコア18

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

0グッド

0クリップ

投稿2017/10/10 01:33

編集2017/10/25 06:54

pythonであるデータをファイルにかきこみたいです。

python

1#!/usr/bin/env python 2 3hoge_dict = {} 4 5for line in f1: 6 hoge_dict[line.split(';')[0]] = line.rstrip() 7 hoge_dict[line.split('\n')[0]] = line2.rstrip() 8for line in f2: 9 line = line.rstrip() 10 line2 = line2.rstrip() 11 if line in hoge_dict: 12 f3.write(str(hoge_dict[line]) + '\n') 13 print(hoge_dict[line])

ファイルf1
123456;764365
765472;825695
746174;956798
のようなデータが10万近く入っています

ファイルf2
467678
123456
758989
のようなデータが10万近く入っています

今、このコードはファイル1の;より左部分とファイル2が一致した場合ファイル1の内容が出力されるように作りました。
しかし、出力だけではなく別のファイるにその結果を保存したいと思い、その保存方法をお伺いしたいです。
123456;764365
.....
のように開業されて保存されるのが望ましいです。
テキストファイルに入れようと思っています。
うまく質問ができず申し訳ありません。答えていただけたら幸いです。

コードの上の部分が大きくなってしまっているのは気にしないでください。

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

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

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

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

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

aaa12

2017/10/10 02:57

そうですよね、、申し訳ありません。今は時間が作れないので夕方時間ができたらいただいたサイトを参考に書き直しをさせていただきます。ご指摘ありがとうございます!
guest

回答5

0

ベストアンサー

改行する一番簡単な方法は、改行文字を追加することです。

Python

1f3.write(str(hoge_dict[line]) + '\n')

コメントを受けて

即興で作ったソート用のスクリプトです。即興なので多分クソです。

Python

1import sys 2 3if len(sys.argv) != 2: 4 exit() 5 6src_filename = sys.argv[1] 7with open(src_filename) as f: 8 data_list = [line.rstrip() for line in f.readlines()] 9 10data_list.sort(key=lambda x: int(x.split(';')[0])) 11src_filename = src_filename.split('.') 12dst_filename = src_filename[0] + '_sorted.' + src_filename[1] 13 14with open(dst_filename, 'w') as f: 15 for datum in data_list: 16 f.write(datum + '\n')

コマンドラインでデータを与えればソートします。

>python sort.py file1.txt >python sort.py file2.txt

適当に作ったスクリプトで人様のデータをぶっ壊すのが怖すぎるので、非破壊的にしました。
『ファイル名 + _sorted + 拡張子』という名前で新しく保存します。


クソコード第二弾。

Python

1with open('./file1_sorted.txt') as f: 2 value_list = [line.rstrip() for line in f] 3 4with open('./file2_sorted.txt') as f: 5 key_list = [line.rstrip() for line in f] 6 7for key in key_list: 8 count = 0 9 for value in value_list: 10 if key == value.split(';')[0]: 11 print(value) 12 count += 1 13 else: 14 print(count) 15 value_list = value_list[count:] 16 break

いちおう、次のテストデータをパス。(テストデータが滅茶苦茶小さいが)
file1_sorted.txt

123;890 123;789 123;456 234;678 456;789 456;960 1234;550

file2_sorted.txt

123 234 456

実行結果

>python hoge.py 123;890 123;789 123;456 3 234;678 1 456;789 456;960 2

投稿2017/10/10 04:55

編集2017/10/10 11:38
LouiS0616

総合スコア35660

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

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

aaa12

2017/10/10 09:55

お返事ありがとうございます。やってみたのですが、なぜか改行できませんでした、、今後の参考にさせていただきます!また、もう少し考えてみます。
aaa12

2017/10/10 10:03

以前教えていただいたものに付け足したのですが、hoge_dict = {} for line in f1: hoge_dict[line.split(';')[0]] = line.rstrip() for line in f2: line = line.rstrip() if line in hoge_dict: f3.write(str(hoge_dict[line]) + '\n') print(hoge_dict[line]) インデントが間違っているなどありますでしょうか? 教えていただけたら幸いです。
aaa12

2017/10/10 10:03

hoge_dict = {} for line in f1: hoge_dict[line.split(';')[0]] = line.rstrip() for line in f2: line = line.rstrip() if line in hoge_dict: f3.write(str(hoge_dict[line]) + '\n') print(hoge_dict[line])
LouiS0616

2017/10/10 10:04

コメントでは行頭の空白が効かないので、 _や.を使って工夫してください。
LouiS0616

2017/10/10 10:04

あるいは質問本文を編集するか。
aaa12

2017/10/10 10:08

hoge_dict = {} for line in f1: ____hoge_dict[line.split(';')[0]] = line.rstrip() for line in f2: ____line = line.rstrip() ____if line in hoge_dict: ________f3.write(str(hoge_dict[line]) + '\n') ________print(hoge_dict[line]) 申し訳ありません。ありがとうございます。 このように、なっています。
LouiS0616

2017/10/10 10:10

f3はどのように開いていますか? また、使用しているOSはなんでしょうか。
aaa12

2017/10/10 10:10

LouiS0616さん できました!何回かやり直したところ、なぜかわかりませんがうまく改行できていました!すごく助かりました。ありがとうございます。
LouiS0616

2017/10/10 10:10

少なくともこの部分では、インデントに誤りはないかと思います。
LouiS0616

2017/10/10 10:11

あれ、なんででしょうね。 a(追記)モードで開いて上の方しか見てなかったとか...?
aaa12

2017/10/10 10:13

別の方のアドバイスでaにすると良いということでaにしていました。 それを、今wに変えました。それが関係していたのでしょうか? 実行できてよかったです。
LouiS0616

2017/10/10 10:16 編集

追加書き込み(a)モードにすると、以前の結果が削除されません。 おそらく正常に動作していたんですが、過去の出力に埋もれて気付けなかったのかと思います。 書き込み(w)モードは毎回データを上書きしますので、以前のデータが消えたんでしょう。
aaa12

2017/10/10 10:22

すごくためになります!追記とはそういうことだったのですね。ありがとうございます。とても助かりました。ここからさらにこの結果を使って、進めていきたいと思います。また、わからないことが出てくると思うのでもしよろしければ、またアドバイス宜しくお願いします。
aaa12

2017/10/10 10:27

度々申し訳ありません。 以前教えていただいた、このコードで ファイル1が 123456;678967 123456;876748 に対して、 ファイル2が123456だった時はファイル1の両方がファイル三に記されますか? 質問がわかりにくくなってしまい申し訳ありません。
LouiS0616

2017/10/10 10:30

一度辞書に落とし込んでるので、そのようには動作しません。
aaa12

2017/10/10 10:32

そうなのですね。そのように、するにはどうしたらよいのでしょうか?
LouiS0616

2017/10/10 10:34

ファイル1の内容とファイル2の内容はソートされていますか? また、されていない場合はしてしまってもいいんでしょうか。
aaa12

2017/10/10 10:39

ソートはされていませんが、ファイル1に関しては左側が同じ数値の場合は全部まとまって格納されています。 ソートしてしまって大丈夫です。 その際、一緒に左側の数字に対して右側の数字はいくつあるかの数え上げをして昇順に並べることはできますか? わかりにくいと思うので、次のコメントで例を書きます!
aaa12

2017/10/10 10:42

ファイル1 123;789 123;456 123;890 234;678 456;789 456;960 ファイル2 123 456 234 出力したい内容 123;789 123;456 123;890 3 456;789 456;960 2 234;678 1 意図していることが、伝わるでしょうか? 質問ばかりになってしまい申し訳ありません
LouiS0616

2017/10/10 10:46

意図していることはなんとなくわかります。 ファイル1には何行くらいデータがあるんでしょう?
aaa12

2017/10/10 10:49

すごく多くて、1000は楽に越えています。(ー ー;)
LouiS0616

2017/10/10 10:57

ファイルの内容を全部読みだして、ソートして再保存してやりましょう。 その方がたぶん後々楽です。 回答に追記するので少々お待ちください。
aaa12

2017/10/10 11:00

申し訳ありません。宜しくお願いします、、、 ちなみに昇順に並べるのは100個程度でも大丈夫です。 (全部出力するのが大変なようでしたら、、)
LouiS0616

2017/10/10 11:16

とりあえず先にソート用のスクリプトだけあげました。 非破壊的な設計になってるので、とりあえず実行して様子を見てみてください。
LouiS0616

2017/10/10 11:27

スクリプト全文上げました。 ものすごく小さなテストデータでやってますので、なにかバグがあるかもしれませんが。 挙動を把握して、ある程度自前で解決できるようにしてください。
aaa12

2017/10/10 11:28

ありがとうございます。filenameの所に1個目のファイルを入れれば良いのでしょうか?
LouiS0616

2017/10/10 11:30

コマンドライン引数として与えればあとは書き換えなくて大丈夫です。
aaa12

2017/10/10 11:32

理解不足で申し訳ありません。 コード自体はそのままで、python sort.py の後にファイルの名前をつけるということで大丈夫ですか?
LouiS0616

2017/10/10 11:34 編集

そういうことです。 カレントディレクトリを適切に移動してくださいね。 まあ、ファイルとsort.pyが同じディレクトリにあればなんら問題ないはずです。
aaa12

2017/10/10 11:36

はい。大丈夫です。元々のファイルがtxtファイルなので、最後のpyは省いて大丈夫ですか?
LouiS0616

2017/10/10 11:38

あ、それはミスです。 元と同じ拡張子にしてください。
aaa12

2017/10/10 11:40

はい、それで実行してみます!
aaa12

2017/10/10 11:52

実行しているのですが、ずっと実行中で止まりません。第一弾のコードです。データ量が多いからでしょうか?
LouiS0616

2017/10/10 11:54

おそらく。小一時間ほっといてください。
aaa12

2017/10/10 11:58

packet_write_wait: Connection to 130.158.76.246: Broken pipe このようなエラーが出て止まってしまいました。
LouiS0616

2017/10/10 12:00

データでかすぎたかもしれないですね。 ファイルをいくつかに分割してみてください。
aaa12

2017/10/10 12:09

はい、少しやってみます
aaa12

2017/10/10 12:14

今、データ量がどれくらいかな〜とみたのですが wc -l ファイル名でやった511293163行になるそうです。 これだけ多くのデータでも分割すれば実行できますか? もしくは、他のやり方のほうが良いですか?
LouiS0616

2017/10/10 12:16

1000行どころじゃないですね... データを再利用したいならソートした方がいいです。 再利用しないなら、そのまま使うのもありでしょう。
aaa12

2017/10/10 12:39

本当ですね、、もともとコピーのデータなので、再利用は大丈夫です。 その場合は、ソートせずに、第二弾のコードを実行で大丈夫ですか?
LouiS0616

2017/10/10 12:44

二つ目のスクリプトは、 『一つ目のデータと二つ目のデータの順序が前後しないこと』が前提なので無理です。 ソートされていないデータに対するスクリプトを組むのは難しくないですが、実行にとんでもなく時間がかかります。
aaa12

2017/10/10 12:47

そうなのですね。色々説明までつけていただいて、ありがとうございます。 今日はとりあえず地道にソートしていこうと思います!
aaa12

2017/10/13 10:32

お久しぶりです。先日はありがとうございました。教えていただいたコードでソートができましたので報告させていただきます。とても助かりました。まだ、第二弾までは行けてないのですが先にお礼をと思いまして、、、ありがとうございました。
aaa12

2017/10/13 15:10

夜遅く申し訳ありません。コード第二弾もうまく動かすことができました。ありがとうございます。最後にこの結果を結果の数が多い順に他のtxtファイルに保存したいと思っているのですが、どのようなコードにすれば良いのでしょうか?第一弾を真似して書いてみたのですが、なかなかうまくいかなくて、、お時間のあるときにお返事いただけたら幸いです。
aaa12

2017/10/13 15:11

123;456 : 5 345;890 345;876 2 567;984 1 0 のようになったら嬉しいです。 0を表示させない方法もありますか?
guest

0

@aaa12さん、
なるほどですね、これはどうですか↓

f1 = open('1.txt', 'r') f3 = open('3.txt', 'w') for f1_lines in f1: f2 = open ('2.txt', 'r') for f2_lines in f2: if(f1_lines.split(';')[0].rstrip() == f2_lines.rstrip()): f3.write(f1_lines) f2.close() f3.close() f1.close()

※答えじゃなかったら、遠慮なくお知らせください

投稿2017/10/10 09:22

rev_timo

総合スコア117

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

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

aaa12

2017/10/10 09:57

お返事ありがとうございました。 このコードでやってみたのですが実行にかなりの時間がかかり結果までたどりつけない状態です。インデントもこのままやりました。どこか間違っているのでしょうか? また、私の説明で分かりにくいところがあれば修正します!なんでもおっしゃってください。
aaa12

2017/10/10 10:12

Tuangさん なんとか実行に移すことができました! ありがとうございました。すごく助かりました。ありがとうございます。
guest

0

毎回ファイルに結果書きたいなら、改行する必要があると思います。
例えば:

f = open('abc.txt', 'w') f.write("123\n") f.write("456\n") f.clode() #このようにも書けます↓ f = open('abc.txt', 'w') f.writelines(["abc\n","def\n"]) f.close()

投稿2017/10/10 02:14

rev_timo

総合スコア117

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

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

aaa12

2017/10/10 02:25

ありがとうございます。はい、改行のところで悩んでいました、ありがとうございます。また、すごく大量のデータでf.writeの中身を直接書くことを避けたく、このコードを書いたのですが、このコードの場合だと改行したい時、どこに入れればよいでしょうか?hoge_dict = {} for line in f1: hoge_dict[line.split(';')[0]] = line.rstrip() for line in f2: line = line.rstrip() if line in hoge_dict: f3.write(hoge_dict[line].rstrip('\n')) print(hoge_dict[line]) このままだと改行されません。
rev_timo

2017/10/10 02:39

@aaa12さん 申し訳ないけど、もう少しコードを具体的に書いていただければ、助かる。 多分こういうことかな~ですが、、 ポインタを移動すればどうでしょうか? .seek()メソッドを使ってみてください。 ではなかったら、 open関数の引数のモードを"a"にして、ファイルの未尾に追加・改行 みたいな感じはどうでしょう 答えじゃなかったら、すまん~
aaa12

2017/10/10 02:43

わかりにくくて申し訳ありません。コードをどこまで書けば伝わるのかも、まだわかっていない初心者でして、、申し訳ありません。質問本文の方を書き直します。お時間のあるときに見ていただけたらありがたいです。
aaa12

2017/10/10 02:59

書き直したのですがまだわかりにくいままです、、夕方また書き直します。その際、見ていただけたらありがたいです
guest

0

気になったこと。
変数sが定義されていない。インデントがしっかりされていないため、

f = open('abc.txt', 'w') f.write(s) f.close()

がfor 文の外か中かわからないです。

投稿2017/10/10 02:27

GOTA77

総合スコア160

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

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

aaa12

2017/10/10 02:57

ありがとうございます。確かにそうでした!参考にさせていただきました。
guest

0

書き込むファイルを開く際に、上書きモード('w')ではなく追記モード('a')にするとデータが順次書き込まれていきます。

質問のコードだと

f = open('abc.txt', 'w')

f = open('abc.txt', 'a')

にすれば良いです。

投稿2017/10/10 02:06

coco_bauer

総合スコア6915

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

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

aaa12

2017/10/10 02:16

ありがとうございます。 その際に書き込みごとに改行したい場合はどのようにすればよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問