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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1385閲覧

[Python3]テキストファイル内のデータの一部分を別のテキストファイルに書き込みたい

balckbell

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/01/07 01:58

編集2019/01/07 02:49

こんにちは。Python3についての質問があります。お時間がある際にお答えいただければ幸いです。

###目標
アウトライン:
テキストファイル1に書き込まれたデータの一部分だけをテキストファイル2に書き込みたい。
(現在は簡単のため非常に小さいファイルを扱っているが、将来的には数GBほどの大きいファイルを扱いたい。)

詳細:
Python3のコードを実行しa.txtに表示した100行3列のリストを読み込み、1行目から10行目までのみを抽出して、b.txtに改めて書き込むという作業をしたい。(これを一気に行いたい。)

使用するデータを表示するためのコード(can110さんに教えていただきました。):

Python3

1import numpy as np 2 3b = np.arange(0.005, 0.05, 0.0001) 4c = np.arange(1.5, 2.51, 0.01) 5 6# ファイルに書き込み 7with open('a.txt','w') as f: 8 for a in range(1,101): 9 f.write('{:<3d} {:<3f} {:<3f}\n'.format(a,b[a-1],c[a-1])) 10 11# ファイルから読み込み 12#Without this part, data only show up on the 'a.txt'. 13with open('a.txt','r') as f: 14 for line in f: 15 print(line.rstrip('\n'))

このコードに続けて、b.txtに書き込むコードを書きたい。

###試したこと(追記:アメリカ時間6:47pm)

Python3

1import numpy as np 2 3b = np.arange(0.005, 0.05, 0.0001) 4c = np.arange(1.5, 2.51, 0.01) 5 6# ファイルに書き込み 7with open('a.txt','w') as f: 8 for a in range(1,101): 9 f.write('{:<3d} {:<3f} {:<3f}\n'.format(a,b[a-1],c[a-1])) 10 11# ファイルから読み込み 12#Without this part, data only show up on the 'a.txt'. 13with open('a.txt','r') as f: 14 for line in f: 15 with open('b.txt', 'w') as f: 16 for a in range(1,11): 17 f.write('{:<3d} {:<3f} {:<3f}\n'.format(a,b[a-1],c[a-1])) 18 print(line.rstrip('\n')) 19

これを実行すると、b.txtに1〜10行目まで表示されるのですが、ターミナル上に各行x10回ずつ表示されてしまいます。ループの部分に問題があるのは明らかなのですが、いじってみてもインデントがマッチしないということでどうしても正常に実行できません。

###調べたこと、参考ウェブサイトなど
How to read a large file, line by line
Read large text files in Python, line by line

上記ウェブサイトでinfileやfileobjectなどが出てきたのですが、理解できませんでした。

###実行環境
macOS Mojave
Atom 1.31.2

不足情報があれば随時追加しますのでご指摘ください。よろしくおねがいします。

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

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

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

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

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

t_obara

2019/01/07 04:30

open .. as f のfが何かご理解していますか?読み込み時と、書き込み時と同じfを指定しています、これは意図してやっていますか?書き込みデータに読み込んだデータ(line)が使われていません(a,b,c配列のみ)、これでは意図と異なるのではないですか?
balckbell

2019/01/07 07:32

ご指摘ありがとうございます。 with open...as fというコードでファイルを読んだり書いたりできる、という知識しかなく、f自体が何かは理解できていません。(変数の一種でしょうか?)そのように学んだため、読み込み時と書き込み時どちらでもfを使用しました。(常にそのような形をとるのだと思っていました。) lineが使われていないとは、"試したこと"欄に記載した方のコード(#ファイルから読み込み から下の部分)について、という認識で合っているでしょうか?print(line.rstrip...)というコードをfor a in ...の外に出して実行してみたのですが、インデントが合わないとのエラーが出てしまい、どうすればよいかわからなくなってしまいました。
t_obara

2019/01/07 09:19

fは変数ですので、同じものを利用すると想定通りの動作をしなくなります。printは標準出力に印字するコードになっているので、標準出力に印字されています。なぜ、printでlineを使い、writeでlineを使っていないのでしょうか。
balckbell

2019/01/08 07:26

なるほど、では別の変数を用意してやってみます。 print(line...の部分は、教えていただいたコードをそのまま使ったのでwriteへの応用方法がわかりませんでした。もう一度調べてみます。
guest

回答2

0

自己解決

みなさんご協力ありがとうございました。解決しましたので、完成したコードをこちらに提示しておきます。

Python3

1import numpy as np 2 3b = np.arange(0.005, 0.05, 0.0001) 4c = np.arange(1.5, 2.51, 0.01) 5 6# ファイルに書き込み 7with open('a.txt','w') as f: 8 for a in range(1,101): 9 f.write('{:<3d} {:<3f} {:<3f}\n'.format(a,b[a-1],c[a-1])) 10 11 12from itertools import islice 13 14n = 10 15 16with open('a.txt', 'r') as infile: 17 with open('b.txt', 'w') as outfile: 18 first_lines = islice(infile, n) 19 outfile.writelines(first_lines)

お時間を割いてくださり、ありがとうございました。

投稿2019/01/14 19:32

balckbell

総合スコア16

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

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

0

単に行単位ということであれば、以下でOKです。

https://docs.python.jp/3/library/functions.html#print

python3

1 2with open('b.txt', 'w') as fout: 3 4 with open('a.txt','r') as f: 5 for line in f: 6 print(line.rstrip('\n'),fout) 7

投稿2019/01/08 10:48

t_obara

総合スコア5488

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

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

balckbell

2019/01/10 04:49

バタバタしており返信が遅くなってしまいました。すみません。 ご指摘と、回答までありがとうございます。また、ウェブサイトへのリンクをシェアしてくださったことも感謝しております。教えていただいたことを参考に自分でもさらに学ぼうと思います。ありがとうございました。
balckbell

2019/01/13 00:31

こんにちは。教えていただいたことを試してみたのですが、私のやり方が間違っているのか、b.txtに書き込むことができませんでした。その代わり、ターミナル上に 1 0.005000 1.500000(←一行目のデータ) <_io.TextIOWrapper name='b.txt' mode='w' encoding='UTF-8'> というようなものが一行目から百行目まで表示されました。 一行目から十行目までを部分的に取り出してb.txtに改めて書き出したいのですが、どのようにしたらよいでしょうか?お時間があるときに教えていただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問