2017-04-03 126 views
0

我的代碼下面有兩個for循環。第一個將通過目錄pannam循環,其中有一些wav文件。如何結合兩個for循環

print (f_name) 

會產生這些結果:

a.wav 
b.wav 
c.wav 
d.wav 

的代碼將打印所有的wav文件名

然後是另一個循環。這會讀我的文本文件的線corpus_text

print (line_strip) 

會給這些結果

Name of first file 
Name of second file 
Name of Third file 
Name of Fourth file 

我想這兩個結果是這樣的

Name of first file is a 
Name of second file is b 
Name of Third file is c 
Name of Fourth file is d 

這是結合我的代碼,它運行一個無限循環。我想它是關於我無法理解的嵌入式循環。

import os 


    rootdir = r'C:\Users\PANNAM\Desktop\Final_Earthquake\pannam' 

    for dirpath, dirnames, filenames in os.walk(rootdir): 

     for file in filenames: 
     filepath = dirpath +os.sep+file 
     if filepath.endswith('wav'): 
      split_dirpath = dirpath.split(os.sep) 
      f_name, f_ext = (os.path.splitext(file)) 

      print (f_name) 

      with open('test_corpus.txt', mode = 'r+', encoding="utf=8") as f: 

       for line in f: 
        if line.rstrip(): 
         line_strip = line.strip() 
         print(line_strip) 
+0

「'如果」cln「和」raw「不在文件中:'」那不是那麼有效。 –

+0

@ IgnacioVazquez-Abrams是的我知道,它只是一個小小的修復。但是,你能幫我解決這個問題嗎? – choman

+0

我試過'如果「pannam_11」和「pannam_12」不在f_name中:'但是沒有給我這樣使用它的結果。 – choman

回答

0

現在我明白你想要什麼,但我不知道我明白你爲什麼要這樣做。無論如何,根據您所需的輸出,您根本不需要任何嵌入式循環。 您應該使用 zip, 或者可能使用 itertools.zip_longest

下面,我假設你已經有了提供輸入字符串---文件名和文本行的函數或生成器。 我已經在下面硬編碼了,所以我可以專注於有趣的部分。

import itertools 
import os.path 


def output(prefix, filename): 
    stem, __ = os.path.splitext(filename) 
    return prefix + ' is ' + stem + '.' 


def main(): 
    prefixes = ['Name of first file', 'Name of second file'] 
    filenames = ['a.wav', 'b.wav', 'c.wav', 'd.wav'] 

    print('zip:') 
    for prefix, filename in zip(prefixes, filenames): 
     print(output(prefix, filename)) 
    print() 

    print('itertools.zip_longest:') 
    for prefix, filename in itertools.zip_longest(
     prefixes, 
     filenames, 
     fillvalue='[unknown file]' 
    ): 
     print(output(prefix, filename)) 
    return 


if "__main__" == __name__: 
    main() 

輸出:

zip: 
Name of first file is a. 
Name of second file is b. 

itertools.zip_longest: 
Name of first file is a. 
Name of second file is b. 
[unknown file] is c. 
[unknown file] is d. 

zipzip_longest之間的區別應該就是我想不出你的目標...... 你結合文件名與線路列表提示一個文本文件,其中任何一個都可能超過另一個。 zip只要任何輸入用完就會停止; zip_longest將持續到全部其中用完。 爲了確保合理的輸出,您必須確保兩個輸入列表的長度相同,或者確定如果不是,則決定如何執行。

更糟的是, os.walk 名單通過調用 os.listdiros.scandir, 既不的保證任何特定的順序,這意味着你不能預知哪一個會與行從您的語料庫文件中獲取配對文件。 解決這個問題需要將文件名按照某種可預測的順序排列( (它必須與您的語料庫文件中的行匹配), 或以某種方式確定哪個文件與哪一行一致。