第一步是查看目錄中的所有文件。那是os.listdir
。
接下來,您需要在循環中打開每個文件。所以,到目前爲止,我們得到了:
for filename in os.listdir(directory):
with open(filename) as f:
現在,我們對每個文件做什麼?有幾個不同的選項 - 我們可以在整個文件(或mmap
它)中讀取,然後使用str.find
或正則表達式方法來解析它,或者我們可以一行一行地跟蹤我們的狀態,或者我們可以轉換我們可以建立一個狀態機並運行它,或者...
我認爲對於新手來說最簡單的就是手動逐行執行。但讓我們把它包裝在一個函數中。所以:
def parse_file(f):
paths = []
found_paths = False
for line in f:
line = line.strip()
if not found_paths:
if line == 'paths':
found_paths = True
else:
if line.startswith('file path='):
paths.append(line[len('file path='):])
else:
break
return paths
paths = []
for filename in os.listdir(directory):
with open(filename) as f:
paths.append(parse_file(f))
我怎樣才能找到第一個行後停止?
只讀break
看完第一行後。所以,與其這樣:
if line.startswith('file path='):
paths.append(line[len('file path='):])
else:
break
這樣做:
if line.startswith('file path='):
paths.append(line[len('file path='):])
break
我怎麼能解決這個問題就擺在不同的指數的路徑在字典中,因爲它把所有的人都在第一場
那麼現在,你是不是創建一個字典,你要創建一個列表。
如果您想要一個字典,將每個文件映射到該文件中的文件路徑列表,這很容易。取而代之的是:
paths = []
for filename in os.listdir(directory):
with open(filename) as f:
paths.append(parse_file(f))
這樣做:
paths = {}
for filename in os.listdir(directory):
with open(filename) as f:
paths[filename] = parse_file(f)
但是,它可能是簡單的不能建立在首位的列表,如果你只想要一個值。如果你找到一個,你只需要返回路徑名,如果你不這樣做的話,它不可能是一個路徑名(如None
)。
我該如何修改有問題的路徑。因爲文件的路徑保存在這種格式 - 我只想複製C:\文件夾\文件夾
嗯,首先,我的代碼甚至不會找到與該格式事情。您要求找到像file path=…
這樣的行,因此我使用了startswith
,但<file path=
不以此開頭。所以你首先需要改變你檢查的startswith
。同時,您還需要處理引號和尖括號。
在這一點上,它看起來像只是愚蠢的文字處理可能不是正確的答案。這看起來像XML。解析XML文檔的最簡單方法是使用XML解析器,如xml.elementtree
。如果它不是一個XML文件,只要有卡在它的XML節點基於行的文件,你可以仍然嘗試解析每行一個XML文檔,但它可能是更容易使用re
用合適的正則表達式(例如,r'<file path="(.*?)"/>'
將僅匹配引號之間的部分)。不知道你的實際輸入文本的樣子,我不能給你任何東西比這更具體。
最後,在完成該步驟後,它看起來像要從目錄路徑中刪除尾部反斜槓,所以即使該文件有C:\folder\folder\
,也會得到C:\folder\folder
。你可以在os.path
此使用的功能,但如果你確定的路徑總是會在Windows格式,它可以更簡單,只是告訴它刪除任何尾隨的反斜槓,與rstrip('\\')
。 (請注意那裏的雙反斜槓,因爲您需要在Python字符串中跳出反斜槓。)
好吧,如果你期待幫助,你應該先用適當的英語解釋你的問題。 現在,不可能遵循你想說的話,用你的標點和語法搞砸了。 – geenux 2013-03-28 00:12:24