2017-09-14 68 views
0

我有一個目錄包含50個文件我想逐一閱讀它們並與其他文件比較 - 這是固定的。我正在使用glob.blob。但它沒有奏效。自動讀取多個文件沒有手動文件命名

這裏我是如何讀取所有文件的。相反,path = '*.rbd'如果我給它的文件名如path = run-01.rbd它的工作原理。

path = '*.rbd' 

path = folder + path 
files=sorted(glob.glob(path)) 

完整代碼

import glob 
from itertools import islice 
import linecache 

num_lines_nonbram = 1891427 

bits_perline = 32 

total_bit_flips = 0 

num_bit_diff_flip_zero = 0 
num_bit_diff_flip_ones = 0 
folder = "files/" 

path = '*.rbd' 

path = folder + path 
files=sorted(glob.glob(path)) 

original=open('files/mull-original-readback.rbd','r') 

#source1 = open(file1, "r") 

for filename in files: 
del_lines = 101 

with open(filename,'r') as f: 
    i=1 
    while i <= del_lines: 
    line1 = f.readline() 
    lineoriginal=original.readline() 
    i+=1 
    i=0 
    num_bit_diff_flip_zero = 0 
    num_bit_diff_flip_ones = 0 
    num_lines_diff =0 

    i=0 
    j=0 
    k=0 
    a_write2 = "" 
    while i < (num_lines_nonbram-del_lines): 
     line1 = f.readline() 
     lineoriginal = original.readline() 
     while k < bits_perline: 
       if ((lineoriginal[k] == line1[k])): 
        a_write2 += " " 
       else: 
        if (lineoriginal[k]=="0"): 
        #if ((line1[k]=="0" and line1[k]=="1")): 

         num_bit_diff_flip_zero += 1 
        if (lineoriginal[k]=="1"): 
        #if ((line1[k]=="0" and line1[k]=="1")): 

         num_bit_diff_flip_ones += 1 

        #if ((line1[k]==1 and line1[k]==0)): 
         #a_write_file2 = str(i+1) + " " + str(31-k) + "\n" + a_write_file2 
         #a_write2 += "^" 
         #num_bit_diff_flip_one += 1 
        # else: 
        # a_write2 += " " 
       k+=1 


       total_bit_flips=num_bit_diff_flip_zero+num_bit_diff_flip_ones 
     i+=1 

     k=0 
i = 0 
print files 
print "Number of bits flip zero= %d" %num_bit_diff_flip_zero +"\n" +"Number of bits flip one= %d" %num_bit_diff_flip_ones +"\n" "Total bit flips = %d " %total_bit_flips 


f.close() 
original.close() 
+0

'print files'顯示什麼? – Barmar

+0

它顯示目錄中的所有文件名稱... – hassan

+0

「它沒有工作」。它做錯了什麼? – Barmar

回答

1

您可以使用os模塊在一個目錄列表第一的一切(包括文件和模塊),然後使用一個Python生成器來過濾出的文件。然後,您可以使用第二個Python生成器來過濾具有特定擴展名的文件。有可能是做的更有效的方法,但這個工程:

import os 

def main(): 

    path = './' # The path to current directory 

    # Go through all items in the directory and filter out files 
    files = [file for file in os.listdir(path) if 
os.path.isfile(os.path.join(path, file))] 

    # Go through all files and filter out files with .txt (for example) 
    specificExtensionFiles = [file for file in files if ".txt" in file] 

    # Now specificExtensionFiles is a generator for .txt files in current 
    # directory which you can use in a for loop 
    print (specificExtensionFiles) 


if __name__ == '__main__': 
    main() 

更多參考: How do I list all files of a directory?


+0

爲什麼這比使用'glob.glob()'來列出他想要的文件要好? – Barmar

+0

這不是,我真的不知道glob.glob(),並想給他一個快速的解決方案,我知道我的機器上工作,而不是一個有效的。 – Omnomnious

+0

他的問題顯然是循環中的代碼,而不是獲取文件名。 – Barmar

0

的問題是,你不打算回originalfile每當開始您將開始與for filename in files:循環中的下一個文件進行比較。最簡單的解決方案是:

original.seek(0) 

在該循環的開始。

您也可以在循環之前將整個文件讀入列表中,並使用該文件而不是重複讀取文件。

如果您只想處理部分文件,則可以將文件讀入列表中,然後使用列表切片獲取所需的行。

您也不應該設置num_bit_diff_flip_zeronum_bit_diff_flip_one0每次通過循環,因爲這些應該是所有文件之間的總和。

with open('files/mull-original-readback.rbd','r') as original: 
    original_lines = list(original)[del_lines:num_lines_nonbram] 

for filename in files: 
    with open(file, 'r') as f: 
     lines = list(f)[del_lines:num_lines_nonbram] 
    for lineoriginal, line1 in zip(original_lines, lines): 
     for k in range(bits_perline): 
      if lineoriginal[k] == line1[k]: 
       a_write2 += " " 
      elif lineoriginal[k] == "0" 
       num_bit_diff_flip_zero += 1 
      else: 
       num_bit_diff_flip_ones += 1 

total_bit_flips = num_bit_diff_flip_zero + num_bit_diff_flip_ones