1

n個のファイルから行を読み取ろうとしています。次に、すべてのデータを1つのファイルに出力します。トリッキーなことは、dirに含まれるファイルの数がわからないので、すべてのファイルが独自の列を取得できるように印刷したいということです。例:(テキストは私が気にしないデータです。splitを使用して[1]を取得できます)

File 1 contains:
text Line1
text Line2
text Line3

ファイル2には次のものが含まれます。

text Line01
text Line02
text Line03

次のように1つのファイルに結合したいと思います。

File 1 File 2
Line1  Line01
Line2  Line02
Line3  Line03

私が抱えている問題の1つは、ファイルを読み取るときに、一度に1つのファイルを読み取り、各行をリストに追加することですが、それを希望どおりに印刷するにはどうすればよいですか。

fromfiles = ['Line1','Line2','Line3','Line01','Line02','Line03']

また

fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']]

フォームファイルの場合:line1とline01を同時に印刷して、続行するにはどうすればよいですか?

formfiles2の場合:実際には上記と同じ問題。リスト内のアイテムの数を知らずに同時に複数の要素にアクセスしてから、すべてを印刷する必要があります。

誰かがこの問題で私を助けてくれたらありがたいです。

4

3 に答える 3

2

zip()このために作られています!あなたから始めましょうfromfiles2

>>> fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']]
>>> outputlines = zip(*fromfiles2)
>>> for l in outputlines:
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Line03

これがzip基本的にどのように機能するかです:

>>> l1 = [1, 2, 3]
>>> l2 = ['a', 'b', 'c']
>>> zip(l1, l2)
[(1, 'a'), (2, 'b'), (3, 'c')]

もちろん、これは3つ以上の引数でも機能します:-)。

これは、ファイルが小さい場合に適したアプローチです。次に、それらを最初に安全にメモリに読み込み、メモリ内のデータをマージしてから、マージされたデータを出力ファイルに書き込むことができます。ただし、入力が非常に大きい場合(GBデータ)は、入力ファイルを1行ずつ同時に読み取り、出力行を作成してファイルに書き込んでから、入力ファイルの次の行に進む必要があります。

の概念を理解している場合は、メモリ効率を高めるためにzip調べることができます。itertools.izip

>>> from itertools import izip
>>> for l in izip(*fromfiles2):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Line03

また、ファイルに同じ数の入力ファイルがない場合は、itertools.izip_longestを確認することをお勧めします。

>>> fromfiles3 = [['Line1','Line2','Line3'],['Line01','Line02']]
>>> for l in izip_longest(*fromfiles3, fillvalue="Nothing"):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Nothing
于 2012-09-19T22:44:46.757 に答える
0

各ファイルを読み取るときは、ファイルで検出した最大行数(おそらく、len()を使用)を見つけてください。

2番目のソリューションを使用し、各行番号1からグローバル最大値まで反復します。そのファイルの行エントリが存在する場合は、それを印刷します。それ以外の場合はスキップしてください。

# loop through files
# max = number of lines max

for i in range(max):
  line = []
  for file in fromfiles2:
    if len(file) > i:
      line.append(file[i])
    else:
      line.append('')
  # print your line here
于 2012-09-19T22:48:40.203 に答える
-3

fromfiles2...リストのリストのように保存します。

次に、最大行数(すべてのリストの最大の.count())を確認します。

次に、0から次の<<maximum number of lines -1>>ようにforループを作成します(擬似コード):

for(int i = 0; i < maxNumOfLines; i++) {
  String lineToPrint = "";
  for(int j = 0; j < numberOfLists; j++) {
    lineToPrint += listOfLists[j][i];
  }
  File.Write(lineToPrint);
}

注意:ファイルは同じ長さではないため、インデックス[j][i]が存在するかどうかを確認する必要があります。

于 2012-09-19T22:39:46.967 に答える