2014-04-21 40 views
0

目前,我的代碼使用XML文件的名稱作爲參數,以便獲取該文件,解析其中的一些內容並使用它來重命名該文件,我的意思是實際運行我的程序一次,該程序將搜索目錄中的每個XML文件(即使它在一個zip內),並使用與我遇到問題相同的參數對其進行重命名。使用python程序重命名linux目錄中的所有XML文件

#encoding:utf-8 
import os, re 
from sys import argv 

script, nombre_de_archivo = argv 

regexFecha = r'\d{4}-\d{2}-\d{2}' 
regexLocalidad = r'localidad=\"[\w\s.,-_]*\"' 
regexNombre = r'nombre=\"[\w\s.,-_]*\"' 
regexTotal = r'total=\"\d+.?\d+\"' 

fechas = []; localidades = []; nombres = []; totales = [] 

archivo = open(nombre_de_archivo) 

for linea in archivo.readlines(): 
    fechas.append(re.findall(regexFecha, linea)) 
    localidades.append(re.findall(regexLocalidad, linea)) 
    nombres.append(re.findall(regexNombre, linea)) 
    totales.append(re.findall(regexTotal, linea)) 

fecha = str(fechas[1][0]) 
localidad = str(localidades[1][0]).strip('localidad=\"') 
nombre = str(nombres[1][0]).strip('nombre=\"') 
total = str(totales[1][0]).strip('total=\"') 

nombre_nuevo_archivo = fecha+"_"+localidad+"_"+nombre+"_"+total+".xml" 

os.rename(nombre_de_archivo, nombre_nuevo_archivo) 

編輯:這將是一個例子。

目錄只包含3個文件以及程序。

silly.xml amusing.zip feisty.txt

所以,你運行程序而忽略爭強好勝,因爲它是一個txt文件,並讀silly.xml,TI然後解析「fechas,localidad,農佈雷,總「連接或追加或任何和用作爲silly.xml的新文件,然後該程序檢查zip是否有一個XML文件,如果它確實然後它做同樣的事情。

所以最終我們將不得不

20141211_sonora_walmart_2033.xml 20141008_sonora_starbucks_102.xml爭強好勝TXT amusing.zip

+1

如果您顯示您的輸入(文件名列表)和您的預期輸出(修改的文件名),這是有道理的。 – Tomalak

+1

您還需要關閉已打開的文件。 – Lafexlos

+0

我編輯了一些類似的東西。 –

回答

2

你的問題是不明確的,你發佈的代碼過於寬泛。

我無法用我的視力來調試正則表達式,但是您可以通過很多方法來簡化代碼。簡單的代碼意味着更少的錯誤,更容易的時間調試。

要找到你的目標文件,使用glob.glob

files = glob.glob('dir/*.xml') 

要分析他們,拋棄正則表達式,並使用ElementTree API。

import xml.etree.ElementTree as ET 
tree = ET.parse('target.xml') 
root = tree.getroot() 

還有一些模塊可以用CSS表示法和XPATH瀏覽XML文件。使用正則表達式提取字段的文件名是好的,但檢查出named groups

+0

元素樹修剪了很多胖子的代碼,很好的答案。 glob.glob創造了奇蹟。 –

相關問題