4

glob.glob()前回、このサイトで Pythonを使用したフォルダー内の csv ファイルのバッチ処理について質問したときに助けてもらいました。今回はそれを使用して、フォルダー内のすべての csv ファイルを転置しようとしています。以下のスクリプトは、最後のファイルのみを処理して停止します。私は何を間違っていますか?

import csv
import os
import glob

directory = raw_input ("INPUT Folder")
output = raw_input("OUTPUT Folder:")
in_files = os.path.join(directory, '*.csv')

for in_file in glob.glob(in_files):
    with open(in_file) as input_file:
        reader = csv.reader(input_file)
        cols = []
        for row in reader:
            cols.append(row)
            filename = os.path.splitext(os.path.basename(in_file))[0] + '.csv'

with open (os.path.join(output, filename), 'wb') as output_file:
    writer = csv.writer(output_file)
    for i in range(len(max(cols, key=len))):
        writer.writerow ([(c[i] if i<len(c) else '') for c in cols])
4

4 に答える 4

5

for in_fileループの反復ごとに 1 回実行されるように、コードの「出力」部分をインデントする必要があります。

import csv
import os
import glob

directory = raw_input ("INPUT Folder")
output = raw_input("OUTPUT Folder:")
in_files = os.path.join(directory, '*.csv')

for in_file in glob.glob(in_files):
    with open(in_file) as input_file:
        reader = csv.reader(input_file)
        cols = []
        for row in reader:
            cols.append(row)

    # "outdent" this code so it only needs to run once for each in_file
    filename = os.path.splitext(os.path.basename(in_file))[0] + '.csv'

    # Indent this to the same level as the rest of the "for in_file" loop!
    with open (os.path.join(output, filename), 'wb') as output_file:
        writer = csv.writer(output_file)
        for i in range(len(max(cols, key=len))):
            writer.writerow ([(c[i] if i<len(c) else '') for c in cols])

あなたのバージョンでは、そのコードはfor in_fileループが完了した後に一度だけ実行されるためcols、そのループの最後の反復から残ったデータのみを出力します。

filename = ...また、ステートメントをレベルに「アウトデント」しました。これは、各 ごとに1 回ではなく、for in_file各 ごとに 1 回だけ実行する必要があるためです。in_filerowin_file

于 2013-09-16T23:02:32.073 に答える
0

pandasを使用したデータ操作により、多くのマイレージを取得できます。

import os
import pandas as pd

for filename in os.listdir('.'):
    # We save an augmented filename later, 
    # so using splitext is useful for more
    # than just checking the extension.
    prefix, ext = os.path.splitext(filename)
    if ext.lower() != '.csv':
        continue
    # Load the data into a dataframe
    df = pd.DataFrame.from_csv(filename, 
                               header=None, 
                               index_col=None, 
                               parse_dates=False)
    # Transpose is easy, but you could do TONS
    # of data processing here. pandas is awesome.
    df_transposed = df.T
    # Save to a new file with an augmented name 
    df_transposed.to_csv(prefix+'_T'+ext, header=True, index=False)

os.walkサブフォルダーも掘り下げる必要がある場合、バージョンはそれほど変わりません。

于 2013-09-16T23:22:48.467 に答える
0

ここに実用的なものがあります:

1時間グーグルする必要がありましたが、動作し、python33でテストされました

import csv
import os
import glob

directory = 'C:\Python33\csv'
output = 'C:\Python33\csv2'
in_files = os.path.join(directory, '*.csv')

for in_file in glob.glob(in_files):
    with open(in_file) as input_file:
        reader = csv.reader(input_file)
        cols = []
        for row in reader:
            cols.append(row)

    # "outdent" this code so it only needs to run once for each in_file
    filename = os.path.splitext(os.path.basename(in_file))[0] + '.csv'

    # Indent this to the same level as the rest of the "for in_file" loop!
    with open (os.path.join(output, filename), 'w') as output_file:
        writer = csv.writer(output_file)
        for i in range(len(max(cols, key=len))):
            writer.writerow ([(c[i] if i<len(c) else '') for c in cols])
于 2013-11-21T15:11:12.507 に答える
-1

in_files は、その形式で 1 ​​つの結果のみを返します。リストを返してみてください:

in_files = [f for f in os.listdir(directory) if f.endswith('.csv')]
于 2013-09-16T23:06:03.870 に答える