23

そこで、単純なタブ区切りのテキスト ファイルを csv ファイルに変換したいと考えています。string.split('\n') を使用して txt ファイルを文字列に変換すると、各リスト項目が各列の間に「\t」を含む文字列としてリストされます。「\t」をコンマに置き換えるだけでよいと考えていましたが、リスト内の文字列を文字列のように扱わず、string.replace を使用できません。これは、タブ「\ t」を解析する方法がまだ必要な私のコードの始まりです。

import csv
import sys

txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"

in_txt = open(txt_file, "r")
out_csv = csv.writer(open(csv_file, 'wb'))

file_string = in_txt.read()

file_list = file_string.split('\n')

for row in ec_file_list:       
    out_csv.writerow(row)
4

3 に答える 3

46

csvタブ区切りファイルをサポートします。引数delimiterreader次のように指定します。

import csv

txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"

# use 'with' if the program isn't going to immediately terminate
# so you don't leave files open
# the 'b' is necessary on Windows
# it prevents \x1a, Ctrl-z, from ending the stream prematurely
# and also stops Python converting to / from different line terminators
# On other platforms, it has no effect
in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t')
out_csv = csv.writer(open(csv_file, 'wb'))

out_csv.writerows(in_txt)
于 2012-04-19T01:27:00.503 に答える
1

csvモジュールでファイルを読み取るときに常に「rb」モードを使用する必要がある理由:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

サンプル ファイルの内容: データベースから blob などを抽出して得られた制御文字CHAR、Excel 数式での関数の不適切な使用など、古いごみ。

>>> open('demo.txt', 'rb').read()
'h1\t"h2a\nh2b"\th3\r\nx1\t"x2a\r\nx2b"\tx3\r\ny1\ty2a\x1ay2b\ty3\r\n'

\r\nPythonは\n、テキスト モードでファイルを読み取るとき、CP/M、MS-DOS、および Windows に従い\x1aます。

>>> open('demo.txt', 'r').read()
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS

「rb」で開かれたファイルを含む csv は、期待どおりに機能します。

>>> import csv
>>> list(csv.reader(open('demo.txt', 'rb'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\r\nx2b', 'x3'], ['y1', 'y2a\x1ay2b', 'y3']]

しかし、テキストモードはそうではありません:

>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>
于 2012-04-19T03:16:43.283 に答える