1

私は昨日からこの問題をグーグルで調べてきましたが、役に立ちませんでした。

1つのディレクトリ内の多数のファイルをループし、そのループ内の各ファイルの行を処理すると、常に閉じますが、Pythonが同じメモリ空間内のすべてのファイルを開いているように見えるので、 file 以前に開いたファイルからすべてのレコードを取得します。まるでポインター配列にあるかのようです。. . .wtf?

    import os
    import sys
    import glob
    import string
    import cPickle
    path2 = './'
    columnShuffleTable = loadColumnTable('myTable') #func previously defined
    codeScrambleTable = loadScrambleTable('theirTable') #func previously defined
    pathToFiles2 = glob.glob(os.path.join(path2, '*.DAT'))

    for curFile in pathToFiles2:    
        _list = ['',] 
        #this is the variable with which I'm having a problem
        unscrambledCodes = file(curFile[-10:], 'r') 
        #this always yields the actual first line of the file at which I am currently at
        line = unscrambledCodes.readline() 
        _list[0] = '|' + line.strip() #stripping trailing spaces
        #the list length at this point always equates to '1', so up to here everything is great
        print "list length:", len(_list) 
        # this always reads the 2nd line of the very first file I loaded. . .wtf?
        line = unscrambledCodes.readline().strip() 

        while(line):
            #for unscrambledCodes [my input file] 
            print "len list: ", len(_list), "infile", unscrambledCodes 
            nextLine = unscrambledCodes.readline().strip()

            if not nextLine:
                _list.append('|' + line)
                break
            else:
                _list.append( '|' + line[:-14] + scrambleCode(line[-12:], columnShuffleTable, codeScrambleTable))
            #end if

            line = nextLine
        unscrambledCodes.close()
        outfile = open(curFile[-10:-4] + '.Scrambled', 'w')
        output = '\n'.join(_list)
        outfile.write(output)
        outfile.close()

リクエストに応じて、ここに私の i/o サンプルがあります。

入力ファイル 1:
AB00007737106517 COSTCLASSU275
C00000001003193215575053997633693187714
C000000010031932155750539976105307608239

file2:
AB00007736638744 COSTCLASSU275
C000000010030284907699012480608351468369
C000000020030284907699012480751885101503

file3:
AB00007737148207 COSTCLASSU275
C000000010032271716759259098738354718484
C000000020032271716759259098394986919513

desired output file1:
AB00007737148207 COSTCLASSU275
|C000000010031932155750539976079292077121
|C000000010031932155750539976126217711213

file2:
AB00007736638744 COSTCLASSU275
|C000000010030284907699012480968864628712
|C000000020030284907699012480294550195814

file3:
AB00007737106517 COSTCLASSU275
|C000000010032271716759259098216262704445
|C000000020032271716759259098085462231948

current output file1:
AB00007737148207 COSTCLASSU275
|C000000010031932155750539976079292077121
|C000000010031932155750539976126217711213

file2:
AB00007736638744 COSTCLASSU275
|C000000010031932155750539976079292077121
|C000000010031932155750539976126217711213
.
.
.
|C000000010030284907699012480968864628712
|C000000020030284907699012480294550195814
file3:
AB00007737106517 COSTCLASSU275
|C000000010031932155750539976079292077121
|C000000010031932155750539976126217711213
.
.
.
|C000000010030284907699012480968864628712
|C000000020030284907699012480294550195814
.
.
.
|C000000010032271716759259098216262704445
|C000000020032271716759259098085462231948

4

2 に答える 2

0

はい、unscrambledCodes.readline() は一度に 1 行ずつファイルを読み取り、ファイル全体が読み込まれるまで次の行にインクリメントします。

次のようなものを使用できます。

content = unscrambledCodes.readlines()

各行を配列に読み込みます。次に、コンテンツを繰り返し処理し、必要に応じて行を更新できます。

また、file() の代わりに、私は一般的に使用します

myFile = open('filename.txt','r')
content = myFile.readlines()
myFile.close()
于 2012-09-04T09:35:09.887 に答える
0

一般的なコンセンサスは、ファイルの代わりにオープンを使用することです。私はそれから始めます。

次に、開いているファイルに対してジェネレーター内包表記を実行する方がはるかに簡単なので (次のメソッドは改行を返します) asnew_file=[x.strip() for x in unscrambledCodes)]を試してから、必要なその他の操作を実行しますnew_file=["|"+line for line in new_file[:-1]]new_file[-1]=......

また、上記の他の誰かが指摘したように、 with キーワードを試してみたいと思うかもしれません(たとえそれが別のレベルのインデントをもたらすとしても)

with open("....","r") as in_file, open("...","w") as out_file:

`'''.... do your stuff'''`
于 2012-09-04T09:54:01.990 に答える