2012-09-04 44 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