0
directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        lines = input_file.readlines()
        for i in range(0, len(lines)):
            if i==len(lines):
                out_csv.writerow(lines)
            else:
                lines.append(lines[i+1])

映画レビューデータベースでテキストファイルを開いて、テキストファイルの合計データがcsvの1行になるように変換しようとしています。つまり、映画レビューのnegフォルダーは1000ファイルで構成され、csvには1000行が含まれている必要があります1つのファイルの完全なテキストに対応するすべてのテキストの各行について、さまざまな方法を試してみましたが、何らかのエラーが発生します。このコードでは、次のようにエラーが発生します

トレースバック (最新の最後の呼び出し): ファイル "C:\Python27\preprocessing added adnan.py"、51 行目、lines.append(lines[i+1]) の IndexError: リスト インデックスが範囲外です

4

3 に答える 3

0

コードの最後の行は完全に問題があります:

1- for ループfor i in range(0, n):では、iが と等しくなることはなくn、0 から n-1 になります。

2-range(0, n)は と同じなrange(n)ので短い方を使う

3-リストを反復している同じループでリストを変更しないでください

4-lines同じ要素に追加しています。次のように、(ヘッダー以外の) 行を複製していると思います。

lines = lines + lines[1:]

そして、なぜこれをしているのかわかりません!

5- によって返される行fp.readlines()の末尾に改行があり、csv ファイルが破損する可能性があります。

6-次のように、ファイルオブジェクトを単純に反復できますfor line in open(...):

したがって、あなたが書くべきだったコードは次のとおりです。

directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        row = []
        for line in input_file:
            line = line.strip()## removes trailing newline, and possible leading whitespaces
            if line:
                row.append(line)
        out_csv.writerow(row)
于 2013-11-08T06:08:01.317 に答える
0

上記のコード スニペットを修正しました。これを試して、うまくいくかどうか教えてください:

directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
txt_files = os.path.join(directory, '*.txt')
for txt_file in glob.glob(txt_files):
    filename = os.path.splitext(os.path.basename(txt_file))[0] + '.csv'
    with open(txt_file, "rb") as input_file, open("book.csv", 'a') as output_file:
        out_csv = csv.writer(output_file)
        lines = input_file.readlines()
        complete_file_content = [line.strip() for line in lines]
        out_csv.writerow(complete_file_content)

範囲外のインデックスエラーに直面していた理由は、リスト内の (i+1) 番目の要素にアクセスしようとしているためです。たとえば、リストに 0 から 9 までのインデックスが付けられた 10 個の要素が含まれている場合、i が9 で、リスト内に存在しない 10 である i+1 にアクセスしようとします。

このSOの質問内で、複数の行を1行に結合する簡潔な方法を得ました。

お役に立てれば。

于 2013-11-08T06:12:38.103 に答える
0

このループは改造が必要です:

for i in range(0, len(lines)):
        if i==len(lines):
            out_csv.writerow(lines)
        else:
            lines.append(lines[i+1])

行から行にスタッフを追加することも意味がありません。別の変数が必要です。回避するために、このループを次のように書き換えます。

newlist = list()
for i in range(0, len(lines)-1):
    newlist.append(lines[i+1])
out_csv.writerow(newlist)
于 2013-11-08T06:03:40.430 に答える