1

いくつかのファイルの内容を後で呼び出すことができる一意のリストに読み取りたいのですが、最終的には、これらのリストをセットに変換し、それらに対して共通部分と減算を実行したいと思います。これは信じられないほど素朴な質問に違いありませんが、Lutzの「LearningPython」のイテレータとループのセクションを熟考した後、これにアプローチする方法に頭を悩ませているようには見えません。これが私が書いたものです:

#!/usr/bin/env python

import sys

OutFileName = 'test.txt'
OutFile = open(OutFileName, 'w')

FileList = sys.argv[1: ]
Len = len(FileList)
print Len

for i in range(Len):
    sys.stderr.write("Processing file %s\n" % (i))
    FileNum = i
    
for InFileName in FileList:
    InFile = open(InFileName, 'r')
    PathwayList = InFile.readlines()
    print PathwayList
    InFile.close()

いくつかの簡単なテストファイルを使用すると、次のような出力が得られます。

ファイル0を処理しています

処理ファイル1

['alg1 \ n'、'alg2 \ n'、'alg3 \ n'、'alg4 \ n'、'alg5 \ n'、'alg6']

['csr1 \ n'、'csr2 \ n'、'csr3 \ n'、'csr4 \ n'、'csr5 \ n'、'csr6 \ n'、'csr7 \ n'、'alg2 \ n'、 ' alg6']

これらのリストは正しいですが、後で呼び出すことができるように、それぞれを一意の変数に割り当てるにはどうすればよいですか(たとえば、変数名に範囲からのインデックス#を含めることによって)?

完全なプログラミング初心者を正しい方向に向けてくれてありがとう!

4

6 に答える 6

2
#!/usr/bin/env python

import sys

FileList = sys.argv[1: ]
PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % (i))
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()

2 つのファイルを読み込むと仮定すると、次のように行ごとに比較が行われます (長いファイルの余分な行は検出されませんが、一方の行が他方の行よりも多い場合は同じではありません ;)

for i, s in enumerate(zip(PathwayList[0], PathwayList[1]), 1):
    if s[0] == s[1]:
        print i, 'match', s[0]
    else:
        print i, 'non-match', s[0], '!=', s[1]

やりたいことについては、Python のdifflibモジュールを参照してください。並べ替えについては、 Mutable Sequence Typesを参照someListVar.sort()してください。someListVar の内容がその場で並べ替えられます。

于 2011-09-13T20:31:41.020 に答える
1

基本的に、ファイルのリストがあり、これらのファイルの行のリストに変更したい...

いくつかの方法:

result = [ list(open(n)) for n in sys.argv[1:] ]

これにより、次のような結果が得られます-> [['alg1'、'alg2'、'alg3']、['csr1'、'csr2'...]]アクセスは'result[0]'のようになります。 in ['alg1'、'alg2'、'alg3'] .. ..

辞書の方がやや良いかもしれません:

result = dict( (n, list(open(n))) for n in sys.argv[1:] )

連結するだけの場合は、チェーンする必要があります。

import itertools
result = list(itertools.chain.from_iterable(open(n) for n in sys.argv[1:]))
# -> ['alg1', 'alg2', 'alg3', 'csr1', 'csr2'...

初心者のためのワンライナーではありません...しかし、今何が起こっているのかを理解しようとするのは良い運動になるでしょう:)

于 2011-09-13T21:41:04.820 に答える
1

コンテンツがどこから来たのかを覚えておく必要がない場合は、次のようにすることができます。

PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()  

for contents in PathwayList:
    # do something with contents which is a list of strings
    print contents  

または、ファイル名を追跡したい場合は、辞書を使用できます。

PathwayList = {}
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList[InFile] = InFile.readlines()
    InFile.close()

for filename, contents in PathwayList.items():
    # do something with contents which is a list of strings
    print filename, contents  
于 2011-09-13T21:02:59.037 に答える
1

標準ライブラリの一部であり、一度に複数のファイルを処理できるようにするPython のfileinputモジュールをチェックアウトすることをお勧めします。

于 2011-09-13T21:07:30.557 に答える
0

You need a list which holds your PathwayList lists, that is a list of lists.

One remark: it is quite uncommon to use capitalized variable names. There is no strict rule for that, but by convention most people only use capitalized names for classes.

于 2011-09-13T20:50:16.910 に答える
0

読み取り中の各ファイル「番号」の変数名を動的に作成する必要があります。(わざとあいまいにしていますが、このような変数を作成する方法を知っていることは非常に価値があり、自分で見つけた方が覚えやすくなります)

このようなものはあなたに始まりを与えるでしょう

于 2011-09-13T20:29:33.137 に答える