4

固定数の行と列に配置されたデータを含む多数のテキストファイルがあり、列はスペースで区切られています。(.csvに似ていますが、区切り文字としてスペースを使用します)。これらの各ファイルから特定の列を抽出し、それを新しいテキストファイルに書き込みたいと思います。

これまでに試しました:

results_combined = open('ResultsCombined.txt', 'wb')

def combine_results():
    for num in range(2,10):  
        f = open("result_0."+str(num)+"_.txt", 'rb') # all the text files have similar filename styles
        lines = f.readlines()   # read in the data
        no_lines = len(lines)   # get the number of lines

             for i in range (0,no_lines):
                 column = lines[i].strip().split(" ")

                 results_combined.write(column[5] + " " + '\r\n')

             f.close()

if __name__ == "__main__":
    combine_results()

これにより、個別のファイルから必要なデータを含むテキストファイルが、単一の列として生成されます。(つまり、列をすべて別々の列として並べるのではなく、列を互いに「積み重ねる」ことができました)。明らかなことを見逃した気がします。

別の試みでは、必要な列を選択せず​​に、すべての個別のファイルを1つのファイルに書き込むことができます。

import glob

files = [open(f) for f in glob.glob("result_*.txt")]  
fout = open ("ResultsCombined.txt", 'wb')

    for row in range(0,488):
      for f in files:
          fout.write( f.readline().strip() )
          fout.write(' ')
      fout.write('\n')

 fout.close()

基本的に必要なのは、各ファイル(常に同じ列)から列5をコピーして、それらすべてを1つのファイルに書き込むことです。

4

3 に答える 3

2

ファイルの最大行数がわからず、ファイルがメモリに収まる場合は、次の解決策が機能します。

import glob

files = [open(f) for f in glob.glob("*.txt")]

# Given file, Read the 6th column in each line
def readcol5(f):
    return [line.split(' ')[5] for line in f]

filecols = [ readcol5(f) for f in files ]
maxrows = len(max(filecols, key=len))

# Given array, make sure it has maxrows number of elements.
def extendmin(arr):
    diff = maxrows - len(arr)
    arr.extend([''] * diff)
    return arr

filecols = map(extendmin, filecols)

lines = zip(*filecols)
lines = map(lambda x: ','.join(x), lines)
lines = '\n'.join(lines)

fout = open('output.csv', 'wb')
fout.write(lines)
fout.close()
于 2013-01-13T22:12:38.540 に答える
1

各5列目のすべてのエントリをリストに読み込んで、すべてのファイルを読み込んだ後、すべてを出力ファイルに書き込んでみませんか?

data = [
    [], # entries from first file
    [], # entries from second file
    ...
]

for i in range(number_of_rows):
    outputline = []
    for vals in data:
        outputline.append(vals[i])
    outfile.write(" ".join(outputline))
于 2013-01-13T20:26:20.053 に答える
1

またはこのオプション(2番目のアプローチに従う):

import glob

files = [open(f) for f in glob.glob("result_*.txt")]  
fout = open ("ResultsCombined.txt", 'w')

for row in range(0,488):
   for f in files:
       fout.write(f.readline().strip().split(' ')[5])
       fout.write(' ')
   fout.write('\n')

fout.close()

...これは、ファイルごとに固定数の行を使用しますが、中間値をメモリに格納していないため、非常に多数の行に対して機能します。適度な数の行の場合、最初の回答のソリューションがより迅速に実行されることを期待します。

于 2013-01-13T20:57:09.860 に答える