質問するログイン新規登録
Python

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

Q&A

解決済

4回答

724閲覧

with構文を2つ続けると結果がおかしくなります

yyicp

総合スコア78

Python

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

1グッド

2クリップ

投稿2025/05/29 00:51

編集2025/05/29 01:27

1

2

実現したいこと

sample1.datは以下のようなファイルです。
Num p T
1501 0.7 500
1503 1.4 700

sample2.datは以下のようなファイルです。
Num p T
1504 0.8 550
1506 1.9 850

今、この2つのファイルを読み込んで、p<1でまとめたファイルA-1.csv、1<p<2でまとめたA-2.csvを出力したいと思っています。「該当のソースコード」の、
① 25行目~35行目だけをコメントアウトしたコードの出力
② 13行目~23行目だけをコメントアウトしたコードの出力
は正しいのですが、「該当のソースコード」の出力は
A-1.csvが
['1501' '0.7' '500']
['1501' '0.7' '500']
A-2.csvが
['1503' '1.4' '700']
['1503' '1.4' '700']
となっておかしいので、「該当のソースコード」を直してください。

欲しい出力は
A-1.csvが
['1501' '0.7' '500']
['1504' '0.8' '550']

A-2.csvが
['1503' '1.4' '700']
['1506' '1.9' '850']
です。

また、datファイルの読み込みの部分は書けたには書けたのですが、もっとシンプルに(分かりやすく)書くことができそうな気がするので、もしそうであるならば直してください。

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import csv 4 5filename1 = "A-1.csv" 6file1 = open(filename1, 'w') 7 8filename2 = "A-2.csv" 9file2 = open(filename2, 'w') 10 11data = [] 12 13with open("sample1.dat", "r", encoding="utf-8") as f: 14 list = f.readlines() 15for i in list: 16 word = i.split() 17 data.append(word) 18 19for i in range(1,3,1): 20 if float(data[i][1])<1: 21 file1.write(str(data[i])+'\n') 22 elif float(data[i][1])<2: 23 file2.write(str(data[i])+'\n') 24 25with open("sample2.dat", "r", encoding="utf-8") as f: 26 list = f.readlines() 27for i in list: 28 word = i.split() 29 data.append(word) 30 31for i in range(1,3,1): 32 if float(data[i][1])<1: 33 file1.write(str(data[i])+'\n') 34 elif float(data[i][1])<2: 35 file2.write(str(data[i])+'\n')

試したこと

with構文を正しく理解していないのかなと思っていますが、よく分かりませんでした。

melian👍を押しています

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

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

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

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

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

TakaiY

2025/05/29 01:48

デバッグ作業で実行中のデータの内容をチェックしてみれば発見できる内容だと思うのですが、デバッグ作業はしていないのでしょうか。
fiveHundred

2025/05/29 02:13

質問の内容とは全く関係ないですが、listという名前は既に使われているので、この名前の変数は定義してはいけません。
guest

回答4

0

sample1.datの処理後にdataの初期化data = []を追加すれば良いかと思います。

投稿2025/05/29 04:16

meg_

総合スコア10995

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

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

yyicp

2025/05/29 04:59

できました。 どうもありがとうございました。
TakaiY

2025/05/29 06:53

この回答が、最も質問者さんの当初の意図どおりだと思われますね。 dataの初期化もれ
guest

0

既に解決済みですが,御参考として入力ファイルを増やす場合に多少更新し易いと思われる記述例を下記に示します。

なお,出力ファイルの「区切り文字」と「ファイルの拡張子」は入力ファイルに合わせ「タブ」と「.dat」にしてみました。

Python

1import pandas as pd 2 3file_name = ['sample1.dat', 'sample2.dat'] 4 5df_lst = [] 6for fn in file_name: 7 df_lst.append(pd.read_csv(fn, sep='\t')) 8 9df = pd.concat(df_lst) 10 11df.query('p < 1').to_csv('A-1.dat', sep='\t', index=False) 12df.query('1 <= p < 2').to_csv('A-2.dat', sep='\t', index=False)

(追記)
melian様のコメントを加味すると下記の記述例になります。

Python

1import pandas as pd 2 3file_name = ['sample1.dat', 'sample2.dat'] 4 5df = pd.concat([pd.read_csv(fn, sep='\t') for fn in file_name]) 6 7df.query('p < 1').to_csv('A-1.dat', sep='\t', index=False) 8df.query('1 <= p < 2').to_csv('A-2.dat', sep='\t', index=False)

投稿2025/05/29 06:10

編集2025/05/29 07:02
little_street

総合スコア455

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

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

yyicp

2025/05/29 06:22

できました。 どうもありがとうございました。
melian

2025/05/29 06:25

データフレームのリストを渡すなら list comprehension でもよいかと。 file_name = ['sample1.dat', 'sample2.dat'] df = pd.concat([pd.read_csv(fn, sep='\t') for fn in file_name])
little_street

2025/05/29 06:49

コメントありがとうございます。追記しました。
guest

0

With構文の書き方や2つあることが原因ではありません。
同じデータが2つ書けてしまう原因は、配列dataの中にあるデータの捉えかたが間違えていて、31行目からのfor文で参照しているデータの範囲が、file1から読んだものになっているからです。

処理では、file1とfile2を順に読んで、配列dataに順にappendしていますから、質問の場合、2つめのループの段階では

text

1[['1501' '0.7' '500'], 2 ['1503' '1.4' '700'], 3 ['1504' '0.8' '550'], 4 ['1506' '1.9' '850']]

のように入っています。

質問のコードを生かして直すならこんな感じでしょうか。
★ 質問を受けて修正。 CSVの1行目のヘッダーをスキップ。

python

1filename1 = "A-1.csv" 2file1 = open(filename1, 'w') 3 4filename2 = "A-2.csv" 5file2 = open(filename2, 'w') 6 7data = [] 8 9with open("sample1.dat", "r", encoding="utf-8") as f: 10 list = f.readlines() 11for i in list[1:]: 12 word = i.split() 13 data.append(word) 14 15with open("sample2.dat", "r", encoding="utf-8") as f: 16 list = f.readlines() 17for i in list[1:]: 18 word = i.split() 19 data.append(word) 20 21for datum in data: 22 if float(datum[1])<1: 23 file1.write(str(datum)+'\n') 24 elif float(datum[1])<2: 25 file2.write(str(datum)+'\n') 26 27file1.close() 28file2.close()

投稿2025/05/29 01:41

編集2025/05/29 05:27
TakaiY

総合スコア14545

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

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

yyicp

2025/05/29 02:25

ありがとうございます。 私の環境ではうまく動作しませんでした。 エラーメッセージは以下のようなものが出ました。 Traceback (most recent call last): File "〇〇〇\testCV470-2.py", line 26, in <module> if float(datum[1])<1: ^^^^^^^^^^^^^^^ ValueError: could not convert string to float: 'p'
fiveHundred

2025/05/29 02:33

まずはご自身でdataを出力して確認してみてください。
TakaiY

2025/05/29 05:24 編集

みおとしてました。 ちょっと直しますね。
yyicp

2025/05/29 06:17

>TakaiY様 できました。 どうもありがとうございました。
guest

0

ベストアンサー

もっとシンプルに書くことができそうな気がするので、もしそうであるならば直してください。

Pandas を利用すると以下の様に書くことができます。

python

1import pandas as pd 2 3s1 = pd.read_csv("sample1.dat", delimiter="\t") 4s2 = pd.read_csv("sample2.dat", delimiter="\t") 5s_all = pd.concat([s1, s2]) 6a1 = s_all.query("p < 1") 7a2 = s_all.query("1 <= p < 2") 8 9filename1 = "A-1.csv" 10filename2 = "A-2.csv" 11a1.to_csv(filename1, index=False) 12a2.to_csv(filename2, index=False)

投稿2025/05/29 01:29

編集2025/05/29 02:10
melian

総合スコア21296

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

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

yyicp

2025/05/29 01:49

ありがとうございます。 私の環境ではうまく動作しませんでした。 エラーメッセージは以下のようなものが出ました(長いです)。 Traceback (most recent call last): File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\scope.py", line 231, in resolve return self.resolvers[key] ~~~~~~~~~~~~~~^^^^^ File "〇〇〇\Python312\Lib\collections\__init__.py", line 1015, in __getitem__ return self.__missing__(key) # support subclasses that define __missing__ ^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\collections\__init__.py", line 1007, in __missing__ raise KeyError(key) KeyError: 'p' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\scope.py", line 242, in resolve return self.temps[key] ~~~~~~~~~~^^^^^ KeyError: 'p' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "〇〇〇\testCV470.py", line 47, in <module> a1 = s_all.query("p < 1") ^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\frame.py", line 4823, in query res = self.eval(expr, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\frame.py", line 4949, in eval return _eval(expr, inplace=inplace, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\eval.py", line 336, in eval parsed_expr = Expr(expr, engine=engine, parser=parser, env=env) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 809, in __init__ self.terms = self.parse() ^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 828, in parse return self._visitor.visit(self.expr) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 412, in visit return visitor(node, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 418, in visit_Module return self.visit(expr, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 412, in visit return visitor(node, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 421, in visit_Expr return self.visit(node.value, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 412, in visit return visitor(node, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 719, in visit_Compare return self.visit(binop) ^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 412, in visit return visitor(node, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 532, in visit_BinOp op, op_class, left, right = self._maybe_transform_eq_ne(node) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 452, in _maybe_transform_eq_ne left = self.visit(node.left, side="left") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 412, in visit return visitor(node, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\expr.py", line 545, in visit_Name return self.term_type(node.id, self.env, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\ops.py", line 91, in __init__ self._value = self._resolve_name() ^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\ops.py", line 115, in _resolve_name res = self.env.resolve(local_name, is_local=is_local) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "〇〇〇\Python312\Lib\site-packages\pandas\core\computation\scope.py", line 244, in resolve raise UndefinedVariableError(key, is_local) from err pandas.errors.UndefinedVariableError: name 'p' is not defined
melian

2025/05/29 01:53

sample1.dat や sample2.dat の内容が質問にあるものと異なるのかもしれません。例えば、実際にはスペースではなくカンマで項目が区切られているとか、ヘッダが付いていないなどです。
yyicp

2025/05/29 02:05

例えば私のsample1.datは Num p T 1501 0.7 500 1503 1.4 700 のようになっています。 文字と文字、数字と数字の間はタブです。 なので、delimiter=" "をdelimiter=" \t"に直したらうまくいきました。 datファイルをpd.read_csvで読み込むとは思いませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問