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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

2回答

16292閲覧

pythonでtxtファイルをcsvファイルにする方法について

u_k_statistics

総合スコア44

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2016/04/22 10:13

0

0

以下のようなtxtファイルをcsvファイルにしたくてpythonで以下のようなものを書いたのですがうまくいきません。具体的にはcsvファイルの1行1列目のセルに
[aaaaaaaa,bbbbb,・・・,11/30]
とはいっていて、1行2列目のセルに
[aaaaaaaa,bbbbb,・・・,11/30]
とはいってしまいます。

aaaaaaaa〜11/30が1項目ずつ1つのセルに入り、2行目に00000000〜1が1項目ずつ1つのセルに入るようにしたいです。

どうしたらよいでしょうか?
よろしくお願いします。

(txtファイル)
aaaaaaaa bbbbb cccccc dddddddd eeeeee 10/01 10/02 10/03 10/04 10/05 10/06 10/07 10/08 10/09 10/10 10/11 10/12 10/13 10/14 10/15 10/16 10/17 10/18 10/19 10/20 10/21 10/22 10/23 10/24 10/25 10/26 10/27 10/28 10/29 10/30 10/31 11/01 11/02 11/03 11/04 11/05 11/06 11/07 11/08 11/09 11/10 11/11 11/12 11/13 11/14 11/15 11/16 11/17 11/18 11/19 11/20 11/21 11/22 11/23 11/24 11/25 11/26 11/27 11/28 11/29 11/30
00000000 1111111 22222222 ああああああああああああああああああああああああああああああああああああああああああああああ 3 1 × × × × × 1 1 1 1 × × × × 1 1 1 × × × 1 × × × × 1 1 1 1 1 1 × × 1 1 1 1 × 1 1 1 1 1 1 1 × × 1 1 × 1 1 1 × × × 1 1 1 × 1



(以下略)

(pythonファイル)

-- coding: utf-8 --

import csv
import re
if name == "main":

fp = open('test.csv', 'aw') f = open("filename.txt","r") rows1=[] for row in f: rows = re.split('\t',row) rows1.append(rows) w = csv.writer(fp,delimiter=',') w.writerow(rows1) f.close()

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

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

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

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

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

guest

回答2

0

まとめて書き込みたいのであれば、writerow ではなく writerowsが使えるようです。
また、rowをsplitする際には、行末の改行をstripで取り除いておいたほうがよいと思います。

python

1rows1 =[] 2for row in f: 3 #rows = re.split("\t",row) 4 rows = row.strip().split('\t') 5 rows1.append(rows) 6f.close() 7 8w = csv.writer(fp,delimiter = ",") 9w.writerows(rows1)

投稿2016/04/23 14:04

lightson

総合スコア553

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

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

u_k_statistics

2016/04/26 05:19

ありがとうございます。試してみたいと思います。
guest

0

ベストアンサー

書き出し部分を以下のようにしてみたらどうでしょうか

python

1w = csv.writer(fp,delimiter=',') 2for r in rows1: 3 w.writerow(r) 4f.close()

投稿2016/04/23 09:40

yukkeorg

総合スコア985

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

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

u_k_statistics

2016/04/26 05:19

ありがとうございます。 挿入できたのですが、csvファイルを見てみると1行目のみセルの1行1列から1行50列ほどまでが空欄になっていて、その後からaaaaaa bbbb というふうになってしまいました。 一応 if rows is not None: >>>>rows1.append(rows) というふうにしたのですがうまくいきませんでした。 また、日本語が文字化けしてしまうのですが、どのようにしたら治るのかご存じないでしょうか? ちなみにtypeで調べたところシルトの中はすべてstring型でした。 よろしくお願いします。
u_k_statistics

2016/04/26 05:35

追記失礼します。 空欄の件は解決しました。
yukkeorg

2016/04/26 06:49

利用しているpythonのバージョンはわかりますか?
u_k_statistics

2016/04/26 07:19

おそらく2.7.10です。 ただ、プログラムを書くときはsublime textで書いているのですが、sublime text上で import sys print sys.stdin.encoding print sys.stdout.encoding print sys.stderr.encoding と入力して実行すると None None None と出てきます。しかし、ターミナルで実行すると utf−8 と出てきます。 これはターミナルとsublime text上での使用しているpythonが違うのでしょうか? これが関係しているかはわかりませんが、一応ご報告させていただきました。
yukkeorg

2016/04/26 09:43 編集

ありがとうございます。 2.7系ですね。 pythonは実行環境で文字エンコードが不定になりやすいので、この場合は、明示的にファイルを開くときにエンコード指定した方がよいかと思います。 2.7系では、codecsパッケージのopenメソッドを使うと文字エンコードを指定できるので、そちらを使ってデータを読み書きしてみてはいかがでしょうか。
u_k_statistics

2016/04/26 14:35 編集

ありがとうございます。 早速やってみたのですが、以下のプログラムではエラーが出ました。 # -*- coding: utf-8 -*- import codecs import sys import csv import re #sys.stdout = open("temp.csv","w") if __name__ == "__main__": fp = open('temp.csv', 'aw') f = codecs.open("textname","r",'utf-8') rows1=[] for row in f: rows = re.split('\t',row) rows1.append(rows) print rows1 w = csv.writer(fp,delimiter=',') for r in rows1: w.writerow(r) f.close() エラーメッセージ File "/Users/Username/Desktop/pythonfile.py", line 29, in <module> w.writerow(r) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-35: ordinal not in range(128) [Finished in 0.1s with exit code 1] 文字コードなどの知識が全くないので皆目見当もつきません。 申し訳ありませんがよろしくお願いいたします。
yukkeorg

2016/04/26 15:22 編集

Python2.7 の csvライブラリの writerowメソッドがUnicodeの出力に対応していないため、 writerowにデータを渡す前に、内部でUnicodeで表現されているデータを手動でUTF-8でエンコードされたデータに変換する必要があります。 w = csv.writer(fp,delimiter=',') for r in rows1:  r = [s.encode('utf-8') for s in r]  w.writerow(r)  f.close() ※上記の空白には全角スペースが使われているので、コピペする場合は注意してください。
u_k_statistics

2016/04/27 06:26

回答ありがとうございます。 自分なりに書き換えたのですが、以下のプログラムを実行してもエラーは出なくなったのですが文字化けしてしまいます。 textファイルの文字コードなども関係しているのでしょうか? しているとしたらtextファイルの文字コードの確認方法も教えていただけるとありがたいです。 プログラム # -*- coding: utf-8 -*- import codecs import sys import csv import re if __name__ == "__main__": fp = open('temp.csv', 'aw') f = codecs.open("textname.txt","r",'utf-8') rows1=[] for row in f: rows = re.split('\t',row) rows1.append(rows) print rows1 w = csv.writer(fp,delimiter=',') for r in rows1: r = [s.encode('utf-8') for s in r] w.writerow(r) f.close()
yukkeorg

2016/04/27 06:48

もちろん入力するファイルの文字コードも関係があります。今回のプログラムではutf-8であることが前提となっています。 文字のエンコードを確認する方法は、幾つかありますが、テキストエディタで入力ファイルを読み込ませ文字コードを自動判別させ、それを確認する 方法が簡単かと思います。
u_k_statistics

2016/04/28 04:50

回答ありがとうございます。 テキストエディタの方法がよくわからなかったので、ターミナルで確認したところ ターミナルで file --mime textname.txt: text/plain; charset=utf-8 のように出たので、おそらくutf−8だと思うのですがあってますでしょうか? また、文字化けを治す方法はありますでしょうか? 何回も回答いただいて申し訳ないのですが、よろしくお願いします。
u_k_statistics

2016/04/28 05:00

追記失礼します。 教えていただいたプログラムで作成したcsvファイルですが、excelで開くと文字化けしているのですが、Numbersで開くと文字化けしていませんでした。 私としてはexcelで開く際に文字化けしていないようにしたいです。 何か手がかりになるかと思いまして追記させていただきました。
yukkeorg

2016/04/28 05:35 編集

入力ファイルはUTF-8のようですね。 私の環境はLinux(Debian/sid)でPython2.7.11ですが、入力ファイルをUTF-8で保存して、今回のプログラムを実行しても、ファイルには正常に日本語部分も出力できています。 プログラム https://gist.github.com/yukkeorg/bb8c7ad230e1f17ca9413a90ffa77b14
yukkeorg

2016/04/28 05:42 編集

ちなみに、出力ファイルの文字コードはUTF-8になります。
yukkeorg

2016/04/28 05:41 編集

もし、Excelで横込みたい場合は、ExcelがUTF-8に対応していないので、ShiftJIS(cp932)で出力してあげる必要があります。 r = [s.encode('cp932') for s in r] の utf-8 を cp932 に変更してください。
u_k_statistics

2016/04/28 06:52

回答ありがとうございます。 utf−8のところをcp932に変更したところ無事文字化けがなおりました!! 本当にありがとうございます。助かりました。 最後にお聞きしたいのですが、cp932にする前にutf−8のところをsjisにしたりshift-jisなどにして実行したのですがうまくいきませんでした。 なぜcp932で成功してsjisやshift−jisで失敗したのか教えていただけないでしょうか? よろしくお願いいたします。
yukkeorg

2016/04/28 07:22 編集

私の環境ではshift-jis, sjisともに動作しました。 Pythonで利用できるエンコーディング一覧がリファレンスにありましたので参考にしてください。 http://docs.python.jp/2/library/codecs.html#standard-encodings ※なお、shift-jisなど、途中にハイフンがあっても、shift_jisのようにアンダーバーと変換して扱ってくれるようです。 なお、失敗した理由についてですが、「うまくいかない」のがエラーが出力されるのか、UTF-8と同様文字化けしてしまうのか、またその他なのかによって回答内容が変わってきますので、どのようにうまくいかなかったのか教えてください。
u_k_statistics

2016/04/28 08:09

回答ありがとうございます。 状況としてはエラーは出るのですがcsvファイル自体は作成されています。 しかし本来30行ほどの入力があるはずなのですが、9行目までしか入力されていないという状況です。 9行目までは文字化けもなく入力されています。 10行目に入力されるはずの文字をお見せしたいのですが、全てをお見せすることは申し訳ないのですができませんので、どのようなものかだけご説明させていただきます。 (0からはじまる8桁の数字) (0からはじまる7桁の数字) (20160428のような日付を表す数字)  (日本語の文章) ここから以降は数字、日本語、-、×がランダムに並べられているようなもので、それぞれがひとつの要素になっています。 ちなみに9行目と10行目の主な相違点としましては (0からはじまる8桁の数字)のところが9行目は012...なのですが10行目が018...となっています。 以下プログラムとエラーコードです。 プログラム # -*- coding: utf-8 -*- import codecs import sys import csv import re if __name__ == "__main__": fp = open('temp.csv', 'aw') f = codecs.open("textname.txt","r",'utf-8') rows1=[] for row in f: rows = re.split('\t',row) rows1.append(rows) # print rows1 w = csv.writer(fp,delimiter=',') for r in rows1: r = [s.encode('shift_jis') for s in r] w.writerow(r) f.close() エラーコード Traceback (most recent call last): File "/Users/Username/Desktop/pythonfile.py", line 22, in <module> r = [s.encode('shift_jis') for s in r] UnicodeEncodeError: 'shift_jis' codec can't encode character u'\uff0d' in position 0: illegal multibyte sequence [Finished in 0.0s with exit code 1] よろしくお願いします。
yukkeorg

2016/04/28 12:52 編集

エラーで出ている u'\uff0d' (UNICODEの 0xff0d) は、全角のハイフンマイナス(FULLWIDTH HYPHEN-MINUS)と呼ばれる文字で、実は純粋なShift-JIS(sjis、shift_jis)文字コードに変換する際にShift-JIS側に対応する文字コードが無いためにエラーとなります。cp932はShift-JISをもとにマイクロソフトが拡張した文字コードセットで、こちらには対応する文字があるのでエラーが出なかったのです。 文字コードセットは様々な種類があって、日本語における文字コードセットも、JIS(iso-2022-jp)、Shift-JIS(派生系のcp932など含む)、EUC-JP、UTF-8(UNICODE)...などなど沢山あってややこしいのですが、これらをコントロールできるようになるといざという時に役に立ちますので、頭の片隅にでも置いておくと良いかと思います。
u_k_statistics

2016/04/28 13:10

回答ありがとうございます。 shift−jisが対応してなくてcp932が対応している文字が入っていたのが原因だったんですね。 何回も質問に答えていただいたおかげで前に進むことができました。 ありがとうございました。 また何かありましたら質問するかと思いますのでまたその時はまたよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問