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

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

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

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

Q&A

解決済

2回答

2670閲覧

複数テキストファイルから読み込んだリストを順番に列に書き込みたい

mamemomi

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/04/08 05:32

前提・実現したいこと

同一ディレクトリ内のテキストファイルを一括で読み込み、csvファイルに書き込んでいくという作業をしたいです。
どうかよろしくお願いします。

####テキストファイル1
12345\t6789
12346\t6790
...

####テキストファイル2
23456\t7890
23457\t7891
...

####作りたいcsvファイル
text1,value1,text2,value2
12345,6789,23456,7890
12346,6790,23457,7891
...

発生している問題・エラーメッセージ

上記のように改行(列?)がうまくいかず、新たに読み込んだテキストファイルのデータが下に追加されてしまいます。

####現在得られているcsvファイル
12345,6789
12346,6790
...
23456,7890
23457,7891
...

該当のソースコード

python

1list =[] 2for file in files: 3 with open(file)as f: 4 data = f.readlines() 5 for i in data: 6 char=re.match('\d*.\d*\t-*\d*.\d*',i) 7 if char != None: 8 print(char.group()) 9 list.extend([char.group(0).replace('\t',',').split(',')]) 10import csv 11with open('test.csv','a') as f: 12 writer2 = csv.writer(f,lineterminator = '\n', delimiter = ',') 13 writer2.writerows(list)

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

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

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

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

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

guest

回答2

0

pandasを使うというのはどうでしょうか。

Python

1import pandas as pd 2files = ['data1.csv','data2.csv'] 3lst =[] 4for i,file in enumerate(files,start=1): 5 lst.append(pd.read_csv(file, header=None, sep='\t', names=[f'text{i}',f'value{i}'])) 6pd.concat(lst, axis=1).to_csv('output.csv', index=None)

output.csv

text1,value1,text2,value2 12345,6789,23456,7890 12346,6790,23457,7891

投稿2019/04/08 06:37

編集2019/04/08 07:09
magichan

総合スコア15898

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

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

mamemomi

2019/04/08 07:04

早速の回答、ありがとうございます。 無知でお恥ずかしい限りなのですが、pandasは初めて知りました! 実際はデータは二種類だけでなく、何種類もあるのですが、magichan様のプログラムでいう files=['data1.csv','data2.csv'] はどのように出力されているのでしょうか?
magichan

2019/04/08 07:18

出力を追加しました。 pandas は2次元などのテーブルデータを扱うライブラリです。(2次元とは限りませんが・・) まあ、Excelやスプレッドシートのようなものと考えていただくと解り易いかと思います。 この手の処理をするのであれば標準ライブラリで書くよりもpandasを使ったほうがシンプルに記述できるかと思います。
mamemomi

2019/04/09 00:07

ご丁寧にありがとうございます。 本当に助かりました! これでなんとかなりそうです
guest

0

ベストアンサー

元のコードを生かすと、以下のように修正しても出来ます。

Python

1import re 2 3files = ['1.txt', # 1.1 2.2 4 # 3.3 4.4 5 '2.txt'] # 5.5 6.6 6 # 7.7 8.8 7lsts = [] 8for file in files: 9 with open(file)as f: 10 data = f.readlines() 11 lst =[] 12 for i in data: 13 char=re.match('\d*.\d*\t-*\d*.\d*',i) 14 if char != None: 15 print(char.group()) 16 lst.extend([char.group(0).replace('\t',',').split(',')]) 17 lsts.append(lst) # 1ファイル=1要素として追加 18 19print(lsts) # [[['1.1', '2.2'], ['3.3', '4.4']], [['5.5', '6.6'], ['7.7', '8.8']]] 20 21lsts = list(zip(*lsts)) # 縦持ち→横持ちに 22print(lsts) # [(['1.1', '2.2'], ['5.5', '6.6']), (['3.3', '4.4'], ['7.7', '8.8'])] 23 24# 出力(複数)行を構築 25outs = [] 26for r in lsts: 27 outs.append([v for l in r for v in l]) # 横持ちの2次元リストを1次元にflatten 28 29import csv 30with open('test.csv','a') as f: 31 writer2 = csv.writer(f,lineterminator = '\n', delimiter = ',') 32 writer2.writerows(outs) 33""" 341.1,2.2,5.5,6.6 353.3,4.4,7.7,8.8 36"""

投稿2019/04/08 07:09

can110

総合スコア38262

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

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

mamemomi

2019/04/09 00:10

ありがとうございます! 元のコードを使用してくださって助かりました。 コメントが特に分かり易かったです!本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問