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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Q&A

解決済

4回答

4014閲覧

タブで分けられた文字が改行ごとに区切られている文字列をCSVで列を分けて出力したい

dendenmushi

総合スコア98

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

0グッド

1クリップ

投稿2019/07/29 05:49

前提・実現したいこと

tab区切りの3つの要素が、改行ごとに1行として文字列があり、それをcsv出力し、タブごと3列に出力したい。

python

1# print出力 2wordA \t wordB \t wordC 3wordD \t wordE \t wordF 4wordG \t wordH \t wordI 5wordJ \t wordK \t wordL 6wordM \t wordN \t wordO 7wordP \t wordQ \t wordR 8

これらをCSVで3列6行で出力したい。
理想の形

イメージ説明

■■な機能を実装中に以下のエラーメッセージが発生しました。

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

# タブ区切り改行付き文字列をCSV出力 list_csv = [] list_csv_ko = [] list_csv_test = saisyuu_words.split('\n') # 2次元配列を作成 for list_csv_test_youso in list_csv_test: print(list_csv_test_youso) # 子要素の1次元配列を作る list_csv_ko.append(list_csv_test_youso) # 一要素に子要素の1次元配列を代入し、2次元配列を作成 list_csv.append(list_csv_ko) # 1ループごとに1次元配列を初期化する list_csv_ko = []

この場合の結果はまとまってしまいました。
イメージ説明

試したこと

python

1# タブ区切り改行付き文字列をCSV出力 2 3list_csv = [] 4list_csv_ko = [] 5 6list_csv_test = saisyuu_words.split('\n') 7 8# 2次元配列を作成 9for list_csv_test_youso in list_csv_test: 10 print(list_csv_test_youso) 11 # 子要素の1次元配列を作る 12 list_csv_ko.append(list_csv_test_youso) 13 # 一要素に子要素の1次元配列を代入し、2次元配列を作成 14 list_csv.append(list_csv_ko) 15 # 1ループごとに1次元配列を初期化する 16 list_csv_ko = [] 17 18#output = [["abcdeffghij"], ["klmnopqrset"]] 19 20outf = open("test.csv", 'w', newline='') 21writer = csv.writer(outf, delimiter="\t", quotechar='"', quoting=csv.QUOTE_MINIMAL) 22writer.writerows(list_csv) 23outf.close() 24print("出力完了")

結果は同じでした。タブごとに区切るためにはどうしたらよいのでしょうか。アドバイス頂けないでしょうか。よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

win10,python3.7

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

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

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

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

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

guest

回答4

0

ベストアンサー

文字列中の改行コード「\t」をカンマ「,」に置き換えすれば良いと思います。

Python

1str = '10\t20\t30\n40\t50\t60\n70\t80\t90' 2print(str) 3str = str.replace('\t', ',') 4print(str) 5 6f2 = open('comma.txt', mode='w') 7f2.write(str) 8 9f2.close()

Prompt

110 20 30 240 50 60 370 80 90 410,20,30 540,50,60 670,80,90

投稿2019/07/29 12:36

meg_

総合スコア10580

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

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

dendenmushi

2019/07/30 03:03

いろいろな方々に回答頂きありがとうございます。この方法もいいですね。 ==comma.txt============= wordA,398,563 wordB,597,620 ・ ・ ================= これでダブルクォーテで"wordA","398,563"となればベストです。
dendenmushi

2019/07/30 03:09

str = '10\t20\t30\n40\t50\t60\n70\t80\t90' print(str) str = str.replace('\t', '","') str = str.replace('\n', '"' + '\n' + '"') str = '"' + str str = str[:-1] print(str) f2 = open('comma.csv', mode='w') f2.write(str) f2.close() これでなんとか理想の列で文字と数値が分けられ改行されたCSVファイルができました。 みなさま、本当にありがとうございました。
guest

0

入力と出力がTSVなのかCSVなのかわかりませんが、以下を参考にしたら進みませんか?

[Python] csvやtsvの読み書きを行う(csvモジュールの利用)

追記 2019/07/29 18:45

そのサイトを参考に、以下のようなプログラムを組んでみましたが、TSV出力できています。
これではダメなのでしょうか?

python

1# test.py 2import csv 3 4tsvFile = open("test.tsv", 'r') 5tsv = csv.reader(tsvFile, delimiter='\t') 6 7with open('output.tsv', "w", newline="") as f: 8 writer = csv.writer(f, delimiter="\t") 9 for n in tsv: 10 writer.writerow(n) 11

text

1# test.tsv 2a i u e o 3ka ki ku ke ko 4sa si su se so

text

1# output.tsv 2a i u e o 3ka ki ku ke ko 4sa si su se so 5

投稿2019/07/29 06:41

編集2019/07/29 09:45
FiroProchainezo

総合スコア2401

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

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

dendenmushi

2019/07/29 08:29

pythonでprint出力している文字列をcsv書き込みするという内容になります。CSVを作って開いて、そこにライティングするイメージです。そのサイトを参考に記載していました。
FiroProchainezo

2019/07/29 09:44 編集

「print出力している文字列」とは、以下ですか? ```python # print出力 wordA \t wordB \t wordC wordD \t wordE \t wordF wordG \t wordH \t wordI wordJ \t wordK \t wordL wordM \t wordN \t wordO wordP \t wordQ \t wordR ``` これだとCSVではありませんが、上記を「csv書き込みする」とは何を行うのでしょうか? また、「CSVを作って開いて」とは何をしたいんでしょうか?
FiroProchainezo

2019/07/29 09:46

回答に追記しました。確認ください。
dendenmushi

2019/07/29 11:23 編集

print出力している文字列は正確には wordA wordB wordC wordD wordE wordF wordG wordH wordI wordJ wordK wordL wordM wordN wordO wordP wordQ wordR のようにタブは表示されません。 確認しました。回答ありがとうございます。最終目的は、一番上に書きましたが、拡張子CSVで3列に値が入ることです。 なぜもともとの文字列(例:pythonで wordA = 国語教科書数)がタブ区切りかといいますと、2番目のワードが7,889,778のような数値で(例:wordB = 7,889,778)カンマで桁が区切られていまして、文字列と数値の間にカンマを置くよりはタブキーを置いて、それを目印にあわよくばCSVに3列分けて書き込めないかと思っていました。 今考えれば"国語教科書数","7,889,778"とダブルクォーテで囲めばカンマで区切れたかもしれないと後悔してます。 そのplain.tsvをcsvに変えて、3列に書き込むようにもっていくことは可能なのでしょうか。
FiroProchainezo

2019/07/30 01:57

なんだかよくわからないので、まとめますが・・・ 入力は以下ですよね? > wordA wordB wordC 出力も、タブ区切りですよね? > なぜもともとの文字列(例:pythonで wordA = 国語教科書数)がタブ区切りかといいますと、2番目のワードが7,889,778のような数値で(例:wordB = 7,889,778)カンマで桁が区切られていまして、文字列と数値の間にカンマを置くよりはタブキーを置いて、それを目印にあわよくばCSVに3列分けて書き込めないかと思っていました。 上記で間違いないなら簡単です。 > with open('output.tsv', "w", newline="") as f: 上のtsvをcsvに変更してください。 with open('output.csv', "w", newline="") as f: 拡張子が、CSVでもTSVでも、結局はテキストですので。 Excelでは列が分かれて表示されているので大丈夫だと思いますが、いかがでしょうか?
dendenmushi

2019/07/30 02:46

回答ありがとうございます。スタートは表示としてはwordA wordB …です。単純にテキストに表しますと、以下です。 ==saisyuu_words===================== wordA\twordB\twordC\nwordD\twordE\twordF\nwordG\t… ================================ 一直線に一個ずつタブで3個置きに改行\nが入っている状態の文字列がスタートになります。 tsv = csv.reader(saisyuu_words, delimiter='\t') with open('output.csv', "w", newline="") as f: writer = csv.writer(f, delimiter="\t") for n in tsv: writer.writerow(n) ですと、CSVを開きますと、一文字ずつがなぜか改行されて ====output.csv============= w o r d A 8 6 1 , 4 2 3 w o r d B 7 , 8 8 9 , 1 1 2 ========================
FiroProchainezo

2019/07/30 02:55

その入力ファイルをいただけませんか?
dendenmushi

2019/07/30 03:16 編集

回答たくさん頂きありがとうございました。 ==================== str = 'wordA\twordB\twordC\nwordD\twordE\twordF\nwordG\twordH\twordI\n' print(str) str = str.replace('\t', '","') str = str.replace('\n', '"' + '\n' + '"') str = '"' + str str = str[:-1] print(str) f2 = open('comma.csv', mode='w') f2.write(str) f2.close() =================== いろいろなアドバイスを頂いたおかげでできました。 私が質問時に見た目の表示をしてしまったことで混同を招いてしまったようで申し訳ありませんでした。初めから文字列は正規表現混ざりでお伝えしていればよかったです。 本当にありがとうございました。
guest

0

CSVファイルの書き込み(出力): csv.writerを用いて
CSVファイルに書き込みさせてはいかがでしょう?

投稿2019/07/29 06:19

nanami12

総合スコア1015

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

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

dendenmushi

2019/07/29 08:28

行ったところ、test.csvが真っ白になってしまいました。
guest

0

タブで区切られたデータ形式は、TSVとかいいます
ということで、
「python tsv」でぐぐると、タブ区切りのデータを読み込む解説が出てきます。

投稿2019/07/29 06:19

y_waiwai

総合スコア87774

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

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

dendenmushi

2019/07/29 08:30

ありがとうございます。タブ区切りで拡張子CSVは存在しなかったということでしょうか。ありがとうございます。TSV調べてみます。
y_waiwai

2019/07/29 08:42

タブ区切りで読み込めたら、あとはcsvで書き出すだけですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問