2013-05-13 56 views
2

我是一个自学成才的Python新手,我已经对python的运行方式有了一个基本的了解,但是我坚持以下几点。在Python中重命名文件

我有一个文本文件列表,它是邮箱名称的交换服务器邮件转储。我有数百个这些文本文件,它们目前的名称格式为Priv_date.txt,例如Priv_02JAN2004.txt。我需要能够告诉他们来自哪些服务器,因此在这些文本文件中,我想要读取具有实际邮件服务器名称(服务器:MAILSERVER1)的10行,并将其添加或附加到原始文件名。

我想结束的文件名是MAILSERVER1_PRIV_02JAN2004.txt。我对自己能做什么也做不了,对文件路径和名称感到困惑,但看不出我做错了什么。据我得为这样:

import os,sys 

folder = "c://EDB_TEMP" 

for root, dirs, filenames in os.walk(folder): 
    for filename in filenames: 
     fullpath=os.path.join(root,filename) 
     filename_split = os.path.splitext(fullpath) 

     #print fullpath 
     #print filename 

     with open (fullpath, "r") as tempfile: 
      for line in tempfile.readlines(): 
       if "Server:" in line: 
        os.rename(tempfile,+line[10:]+fullpath) 

但我不断收到此错误:

error is TypeError: bad operand type for unary +: 'str'

回答

2

此代码的工作,并做你的描述

#Also include Regular Expression module, re 
import os,sys,re 

#Set root to the folder you want to check 
folder = "%PATH_TO_YOUR_FOLDER%" 

#Walk through the folder checking all files 
for root, dirs, filenames in os.walk(folder): 
    #For each file in the folder 
    for filename in filenames: 
     #Create blank strink for servername 
     servername = '' 
     #Get the full path to the file 
     fullpath=os.path.join(root,filename) 
     #Open the file as read only in tempfile 
     with open (fullpath, "r") as tempfile: 
      #Iterate through the lines in the file 
      for line in tempfile.readlines(): 
       #Check if this line contains "Server: XXXXX" 
       serverline= re.findall("Server: [a-zA-Z0-9]+", line) 
       #If the line was found 
       if serverline: 
        #Split the line around ": " and take second part as server name 
        sname = serverline[0].split(": ") 
        #Set servername variable so isn't lost outside scope of with block 
        servername = sname[1] 
     #If a servername was found for that text file 
     if len(servername) > 0: 
      #Rename the file 
      os.rename(fullpath,root+'\\'+servername+filename) 

这样做是走的目录,如你收到,发现每个路径。对于每个文件,它将获得路径,打开文件并查找包含Server:SERVERNAME的行。然后它将提取SERVERNAME并将其放入servername变量中。文件完成后,它将被关闭,脚本将检查该文件是否生成了服务器名字符串。如果是这样,它通过用SERVERNAME加前缀来重命名文件。

我有一段时间所以决定测试它,所以应该做你想做的事

+0

感谢您的输入。我可以看到我在原文中错过了什么。我一直在看你已经添加的代码o0rebelious0o(谢谢!)我已经通过了它,所以它对我来说很有意义,但我仍然得到一个错误:[Error 32]进程无法访问文件,因为它是被另一个进程使用 不知道为什么。我已经使用过Proc Explorer,并检查了开始解锁,我甚至尝试添加一个新的路径到根变量,所以重命名应该发生在不同的目录中,但似乎没有任何区别。我正在使用Windows 7x64位操作系统。 – user2377057 2013-05-13 19:54:11

+0

它给你这个错误的原因是因为你试图在while文件打开块内重命名文件。文件处于打开状态时,操作系统会锁定它,因此无法重命名。使用python时,需要注意的一点是,缩进块的处理方式与使用java和C等语言中的加紧代码相同,所有缩进的代码都在相同条件下执行,即在with语句中执行。你所需要做的就是把if()语句与with open语句联系起来,它应该在理论上起作用。另请检查创建.txt日志的进程是否未运行 – o0rebelious0o 2013-05-13 21:46:48

+0

再次感谢。这就说得通了。我可能要求在一根棍子上的月球......在Python中:-) ..但我现在得到一个错误123文件名,目录,卷是不正确的。我已经完成了最后一行的打印,并且它(或者也许是我)似乎将一个eol字符放在行中,所以输出看起来像MAILSERVER \ nPRIV_02JAN2004.txt。我看不出为什么。 – user2377057 2013-05-14 05:29:33

3

您的os.rename(tempfile,+line[10:]+fullpath)错误逗号似乎放错了地方。

该错误基本上说,+只是在逗号不能在字符串之前,即行[10:]。

+0

这个。 OP:你应该使用一个编辑器来指出你这样的明显错误,比如Vim + Synstastic,Gedit +插件甚至IDE。它会为你节省很多时间。 – timss 2013-05-13 13:04:27