我想在读取.csv文件后移动它们。
我想出的代码是将文件夹中找到的任何.csv文件移动到存档文件夹。
src1 = "\xxxxxxSource Folder"
dst1 = "\xxxxxxDestination Folder"
for root, dirs, files in os.walk(src1):
for f in files:
if f.endswith('.csv'):
shutil.move(os.path.join(root,f), dst1)
注意:我在代码的开头导入了shutil。
注2:目标归档文件夹在源文件夹中——这会对上述代码产生影响吗?
当我运行这个时,什么也没发生。我没有收到任何错误消息,文件仍保留在源文件夹中。
任何见解都值得赞赏。
编辑(关于我的目标的一些上下文(:我的整体代码将用于读取用户手动移动到源文件夹中的.csv文件,然后我想在使用数据后使用Python归档这些.csv文件。用户放入源文件夹的每个.csv文件都将有不同的名称-没有相同的.csv文件名,这就是为什么我想在源文件夹中搜索.csv文件并将其全部移动
经过一系列研究,我找到了一个解决方案:
import shutil
source = r"\xxSource"
destination = r"\xxDestination"
files = os.listdir(source)
for file in files:
new_path = shutil.move(f"{source}/{file}", destination)
print(new_path)
我让它变得比需要的更复杂——因为文件夹中的所有文件都是.csv,我只需要移动所有文件。谢谢stackoverlfow。
您可以使用pathlib模块。我假设您在目标目录中有相同的文件夹结构。
from pathlib import Path
src1 = "<Path to source folder>"
dst1 = "<Path to destination folder>"
for csv_file in Path(src1).glob('**/*.csv'):
relative_file_path = csv_file.relative_to(src1)
destination_path = dst1 / relative_file_path
csv_file.rename(destination_path)
解释-
for csv_file in Path(src1).glob('**/*.csv'):
glob(返回生成器对象(将捕获目录中以及子目录中的所有CSV文件。现在,我们可以一个接一个地迭代这些文件。
relative_file_path = csv_file.relative_to(src1)
所有csv_files现在都是pathlib路径对象。因此,我们可以使用库提供的函数。其中一个函数是相对的。在这里,它将从src文件夹中复制文件的相对路径。假设你有一个CSV文件,比如-
scr_folder/A/B/c.csv-它将复制A/B/c.csv
destination_path = dst1 / relative_file_path
由于文件夹结构相同,目的地路径现在变为-
dst_folder/A/B/c.csv
csv_file.rename(destination_path)
最后,重命名只会将文件从src移动到目的地。