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

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

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

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

Q&A

解決済

1回答

1930閲覧

csvファイルの中身をそのまま出力!

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/01/22 21:54

コード if __name__=="__main__": for file in sorted(glob.glob("a/*.csv")): file_data=open(file,'r') #ファイルを読み取りモードで開く data=file_data.read() #file_dataを読み取る line_data=data.split('\n') for row in line_data: S = row.split(',') if len(S)==4: Sについての条件式を満たすものをcsvファイルごとに出力

例えば
1/a.csv
[10,100,1000,10000]
[11,101,1001,100001]

1/b.csv
[12,102,1002,10002]

1/c.csv
[13,103,1003,10003]
[14,104,1004,10004]
などデータがあるのですが, 要はcsvファイルの中身をそのまま出力させたいのです。
例)[12,102,1002,10002]

ですが, この状態だと
[1],[0],[1],[0],[0],[1],[0],[0],[0],[1],[0],[0],[0],[0]
[1],[1],[1],[0],[1],[1],[0],[0],[1],[1],[0],[0],[0],[1]
[1],[2],[1],[0],[2],[1],[0],[0],[2],[1],[0],[0],[0],[2],
思うような出力ができません。
どうすれば正しく出力できるか教えてください

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

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

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

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

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

namnium1125

2019/01/22 22:30

「Sについての条件式を満たすものをcsvファイルごとに出力」の部分のコードが気になります。print(row)なのでしょうか? それともprint(S)なのでしょうか? 肝心な部分がわからないので追記いただけると幸いです。m(_ _)m
退会済みユーザー

退会済みユーザー

2019/01/22 22:31

print(S)ですね. 肝心なところが抜けていました.申し訳ございません.
namnium1125

2019/01/22 23:00

ところでSが満たさなければならない条件は列データ数が4であることだけなのでしょうか...?
guest

回答1

0

ベストアンサー

次のコードで問題なく表示されましたが...?

a/1.csv

csv

110,100,1000,10000 211,101,1001,10001 3

python

1import glob 2 3if __name__=="__main__": 4 for file in sorted(glob.glob("a/*.csv")): 5 file_data=open(file,'r', encoding="utf-8-sig") #ファイルを読み取りモードで開く 6 data=file_data.read() #file_dataを読み取る 7 line_data=data.split('\n') 8 9 10 for row in line_data: 11 S = row.split(',') 12 13 if len(S)==4: 14 print(S)

実行結果

bash

1$ python3 tera170375.py 2['10', '100', '1000', '10000'] 3['11', '101', '1001', '10001'] 4

ただしこのコードでは、以下のような最大列数が4より大きいcsvファイルでは正常に動作してくれません。

a/2.csv

csv

11,2,3,4,, 25,6,7,8,9,10 311,12,13,14,, 4

例えば次のように書けばデータが4つの行のみしっかりと表示してくれます。

python

1import glob 2 3for file in sorted(glob.glob("a/*.csv")): 4 with open(file, 'r', encoding="utf-8-sig") as f: #ファイルを読み取りモードで開く 5 for line in f.read().splitlines(): 6 line_data_arr = [s for s in line.split(",") if s != ""] 7 if len(line_data_arr) == 4: 8 print(line_data_arr)

実行結果(階層aには1.csv2.csvがあるとする。)

bash

1$ python3 tera170375.py 2['10', '100', '1000', '10000'] 3['11', '101', '1001', '10001'] 4['1', '2', '3', '4'] 5['11', '12', '13', '14'] 6

追記

二次元配列にしたいならば例えばこうでしょうか?

python

1import glob 2 3matrixs = dict() 4 5for file in sorted(glob.glob("a/*.csv")): 6 matrixs[file] = [] 7 with open(file, 'r', encoding="utf-8-sig") as f: #ファイルを読み取りモードで開く 8 for line in f.read().splitlines(): 9 line_data_arr = [int(s) for s in line.split(",") if s != ""] 10 if len(line_data_arr) == 4: 11 # print(line_data_arr) 12 matrixs[file].append(line_data_arr) 13 14for key, val in matrixs.items(): 15 print(f"{key} :\n{val}\n")

実行結果例

bash

1$ python3 tera170375.py 2a\1.csv : 3[[10, 100, 1000, 10000], [11, 101, 1001, 10001]] 4 5a\2.csv : 6[[1, 2, 3, 4], [11, 12, 13, 14]] 7

追記2

一応、Python2.7系でも動くであろうコードも載せておきますが、私はPython2.7系は詳しくないので、良いコードかどうかは保証しかねます。

python

1import glob 2 3matrixs = dict() 4 5for file in sorted(glob.glob("a/*.csv")): 6 matrixs[file] = [] 7 with open(file, 'r') as f: 8 for line in f.read().splitlines(): 9 line = line.replace(b'\xef\xbb\xbf', "") 10 line_data_arr = [int(s) for s in line.split(",") if s != ""] 11 if len(line_data_arr) == 4: 12 # print(line_data_arr) 13 matrixs[file].append(line_data_arr) 14 15for key, val in matrixs.items(): 16 print "%s :\n%s\n" % (key, str(val))

追記3

フォーマット文字列はPython3.6以降の機能でした、明記しておらずすみません。
Python3.5以前のバージョンで実行している場合はformatメソッドを使用してください。

print("{} :\n{}\n".format(key, val))

投稿2019/01/22 22:44

編集2019/01/25 21:16
namnium1125

総合スコア2043

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

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

退会済みユーザー

退会済みユーザー

2019/01/22 22:47

TypeError: 'encoding' is an invalid keyword argument for this function
namnium1125

2019/01/22 22:51

python2.7系で実行しているのが原因です。python2.7系で実行する必要があるならばその旨を追記し、タグを編集してください。python3系で実行しても構わない場合はpython3系で実行してください。
退会済みユーザー

退会済みユーザー

2019/01/23 06:15

二次元配列でcsvファイルの中身を表してください。
退会済みユーザー

退会済みユーザー

2019/01/25 06:08

print(f"{key} :\n{val}\n") ^ SyntaxError: invalid syntax
namnium1125

2019/01/25 11:04

繰り返しになりますが、python2.7系で実行しているのが原因と考えられます。python3系で実行してください。
退会済みユーザー

退会済みユーザー

2019/01/25 20:49

いやpython3でやっていますよ。真ん中の line.replace(b'\xef\xbb\xbf', "")って何ですか
namnium1125

2019/01/25 21:12

utf-8であることを示すbyte order markというものです、この行はWindows環境(私の環境)で必要なものですので不要かもしれません。除いてエラーにならなければ無視してください。あっても問題はないと思います。 また、エラーに関しても私のほうに非があったかもしれません。追記3に記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問