2012-09-04 51 views
1

我從昨天開始使用googling這個問題並無濟於事;在python2.7中通過目錄中的文件循環讀取文件時出錯

當我遍歷一個目錄中的多個文件,並處理該循環中每個文件的行時,我總是關閉,但好像python打開了同一個內存空間中的所有文件,所以當我循環遍歷一個文件,我從先前打開的文件中檢索所有記錄,就好像它們在一個指針數組中。 。 。 .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
C000000010031932155750539976333693187714
C000000010031932155750539976105307608239

文件2:
AB00007736638744 COSTCLASSU275
C00000001003028490769901248060 8351468369
C000000020030284907699012480751885101503

file3的:
AB00007737148207 COSTCLASSU275
C000000010032271716759259098738354718484
C000000020032271716759259098394986919513

期望的輸出文件1:
AB00007737148207 COSTCLASSU275
| C000000010031932155750539976079292077121
| C000000010031932155750539976126217711213

文件2:
AB00007736638744 COSTCLASSU275
| C000000010030284907699012480968864628712
| C000000020030284907699012480294550195814

文件3:
AB00007737106517 COSTCLASSU275
| C000000010032271716759259098216262704445
| C000000020032271716759259098085462231948

電流輸出文件1:
AB00007737148207 COSTCLASSU275
| C000000010031932155750539976079292077121
| C000000010031932155750539976126217711213

文件2:
AB00007736638744 COSTCLASSU275
| C000000010031932155750539976079292077121
| C000000010031932155750539976126217711213



| C000000010030284907699012480968864628712
| C000000020030284907699012480294550195814
文件3:
AB00007737106517 COSTCLASSU275
| C000000010031932155750539976079292077121
| C000000010031932155750539976126217711213



| C000000010030284907699012480968864628712
| C000000020030284907699012480294550195814



| C000000010032271716759259098216262704445
| C000000020032271716759259098085462231948

+0

氏這似乎是**與陳述**所設計的那種東西。即抓取所有文件名的列表,並在聲明中打開每個文件... –

+1

正如我寫的,我不明白爲什麼unscrambledCodes不會爲第二個'readline()'做正確的事情。也許顯示一些實際的產出,以及你的預期有助於澄清實際問題是什麼? – jszakmeister

+0

@jszakmeister你不知道我想怎麼做,但數據是如此敏感,我會被解僱:-(,可能會被送到法院 – pythonian29033

回答

0

是的,unscrambledCodes.readline()將一次讀取文件的一行,遞增到下一行,直到整個文件被讀入

你。可以使用類似的東西:

content = unscrambledCodes.readlines() 

這將讀取每一行到數組中。然後,您可以遍歷內容,並根據需要更新行。

此外,而不是文件(),我一般用

myFile = open('filename.txt','r') 
content = myFile.readlines() 
myFile.close() 
+0

今天早上我只是把它改爲file(),它們都失敗了,以及你的解決方案,對不起 – pythonian29033

+0

我是不知道我是否正確理解了這個問題,是否當你設置'output ='\ n'.join(_list)'_list包括以前的迭代項目時 –

+0

嗨,山姆,不,只要我去int while循環,以前的記錄開始出來的行var – pythonian29033

0

普遍的共識是使用開放式的,而不是文件。我會以此開始。

其次,儘量做你打開的文件發電機的理解,因爲它是非常容易(下一個方法將返回一個換行符)作爲new_file=[x.strip() for x in unscrambledCodes)],那麼你有任何其他操作,如new_file=["|"+line for line in new_file[:-1]]new_file[-1]=......

另外,作爲別人上文所指出的,你可能會想嘗試與關鍵字(即使它會帶來縮進的另一個層面),如

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

`'''.... do your stuff'''` 
+0

今天早上更改爲文件,看看是否可能會改變任何東西......它不是 – pythonian29033

+0

感謝與事情,我想我昨晚試過了,但沒有無濟於事。 。儘管如此,再試一次也沒有什麼壞處。我會告訴你發生了什麼事 – pythonian29033

相關問題