使用shutil.copy2从文本文件中的路径复制文件

时间:2014-06-10 13:39:47

标签: python-3.x input shutil

我正在慢慢地朝着一个脚本移动,以便在UNC路径列表之后复制文件。

import shutil
src = input("File to read lines from: ") # Using a text file with one UNC path per line
dst = input("Destination folder: ") # UNC path, with write rights
source = open(src, "r")
while True:
    lineread = source.readline()
    shutil.copy2(lineread, dst)
    if len(lineread) == 0:
        break

    print(lineread, end="")

source.close()

我最终得到了错误

OSError: [Errno 22] Invalid argument: '\\\\..\\..\\..\\filename\n'

显然,这些行不能读作raw_strings。

我尝试过更改

source = open(src, "r")

source = open(src, 'r')

然后我得到

TypeError: invalid file: <_io.TextIOWrapper name='filename.txt' mode='r' encoding='cp1252'>

下面的脚本正确列出了这些行。

mynewhandle = open("test.txt", "r")
while True:                            # Keep reading forever
    theline = mynewhandle.readline()   # Try to read next line
    if len(theline) == 0:              # If there are no more lines
        break                          #     leave the loop

    # Now process the line we've just read
    print(theline, end="")

mynewhandle.close()

应该这么简单,我会盲目代码......

1 个答案:

答案 0 :(得分:2)

有几件事需要改进。以下情况很好:

import shutil
src = input("File to read lines from: ") # Using a text file with one UNC path per line
dst = input("Destination folder: ") # UNC path, with write rights

打开文本文件时,我建议您习惯使用with构造。从文本文件中读取行时,请使用for循环。正如eryksun写的那样,返回的行包括换行符。尽可能使用描述性标识符:

with open(src) as file_with_filenames:
    for fname in file_with_filenames:
        fname = fname.rstrip()
        shutil.copy2(fname, dst)
        print(fname)

with将为您关闭对象。考虑for循环,关于循环遍历对象的所有元素。文本文件的元素是作为字符串的行(如果存在则包括换行符 - 不必位于最后一行)。

尝试是否适合您(使用UNC路径)。在错误消息中看到反斜杠加倍是正常的。这就是如何将bacslash表示为转义序列的方式。您可以使用普通斜杠,但我不确定UNC路径的第一部分是否也可以。