【问题标题】:Rename a file in Python在 Python 中重命名文件
【发布时间】:2013-05-07 12:25:45
【问题描述】:

我是几天前自学成才的 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'

【问题讨论】:

    标签: python file-handling


    【解决方案1】:

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

    错误基本上是说逗号后面的+不能在字符串之前,即line[10:]。

    【讨论】:

    • 这个。 OP:您应该使用能够为您指出明显错误的编辑器,例如 Vim+Synstastic、Gedit+plugins 甚至 IDE。这将为您节省大量时间。
    【解决方案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 为前缀来重命名文件。

    我有一些时间所以决定也测试一下,所以应该做你想做的事

    【讨论】:

    • 感谢您迄今为止的意见。我可以看到我在原始帖子中遗漏的内容。我一直在查看您添加的代码 o0rebelious0o(谢谢!)我已经完成了它,所以这对我来说很有意义,但我仍然收到一个错误:[错误 32] 该进程无法访问该文件,因为它是被另一个进程使用不知道为什么。我使用了 Proc Explorer 并检查了 start unlocker ,我什至尝试向根变量添加一个新路径,以便重命名应该在不同的目录中进行,但似乎没有任何区别。我使用的是 Windows 7x64 位操作系统。
    • 它给你这个错误的原因是因为你试图在 while file is open 块内重命名文件。当文件打开时,操作系统对其进行了锁定,因此无法对其进行重命名。对于 python,重要的是要注意缩进块的处理方式与 java 和 C 等语言中的大括号代码 {} 相同。所有缩进的代码都在相同的条件下执行,即在 with 语句中。您需要做的就是将 if len() 语句与 with open 语句内联,理论上它应该可以工作。还要检查创建 .txt 日志的进程是否未运行
    • 再次感谢。这就说得通了。我可能在此处要求棍子上的月亮..在 python 中:-)..但我现在收到错误 123 文件名、目录、卷不正确。我已经完成了最后一行的打印,它(或者可能是我)似乎在该行中放置了一个 eol 字符,所以输出看起来像 MAILSERVER\nPRIV_02JAN2004.txt。我不明白为什么。
    • 如果我把反斜杠反斜杠'//'+服务器名+文件名,我没有在行中得到 EOL 行字符,但仍然得到错误 123 语法不正确。跨度>
    • sname 是否有可能在值后保留回车符?在空闲状态下,输入 sname 并按回车会给出 'MAILSERVER1\n'.. 还是因为我刚刚按 Enter 键而导致的 \n?非常抱歉新手缺乏知识。
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多