如何从 CSV 列表中找到目录中的文件,然后将该文件移动到另一个文件夹? Python

How do I find a file in a directory, from a CSV list, then move that file to another folder? Python

我有一个 csv 文件,第 1 行是 headers,第 1(A) 列是我要查找的文件名,例如i_suck_at_python.xlsx 和第 2(B) 列是我要将其移动到的文件夹名称,例如Lex 烂在 Python。

我在 Openpyxl 上做了类似的事情,只是我只在一行上做了。 下面是我的代码。感谢您的帮助。

此外,我在编码方面遇到了很多问题,尤其是这一行:

with open(csv_file, 'r') as f:

该文件最初是 xlsx,但后来我不得不将其另存为 csv。 'r' 之前是 'rb',然后我读到我必须更改它以及编码细节,但无济于事。

无论如何,这里是实际问题的代码:

import csv
import os
import shutil

def main():

    csv_file = "G:\Key Accounts\Ebills\Lex Bot Test\Test 2\EB Mapping.csv"
    existing_path_prefix = "G:\Key Accounts\Ebills\Lex Bot Test\Test 2\PDFs"
    new_path_prefix = "G:\Key Accounts\Ebills\Lex Bot Test\Test 2\PDFs"

    with open(csv_file, 'r') as f:
      reader = csv.reader(f)
      for row in reader:
        file_name = row[0]
        folder_name = row[1]
        newFolderPath = os.path.join("G:\Key Accounts\Ebills\Lex Bot 
        Test\Test 2\PDFs", folder_name)
        existingFilePath = os.path.join("G:\Key Accounts\Ebills\Lex Bot 
        Test\Test 2\PDFs", file_name)

        if file_name in existing_path_prefix:
          print ("File Exists in: {}".format (existing_path_prefix))
          shutil.move(existingFilePath, newFolderPath)
          print ("File successfully moved")
          break
        else:
          print ("There has been a problem")
main ()

代码运行,但它只是直接转到我的 else 语句,这意味着它没有获取文件夹中的文件。再次感谢。

我想我应该提一下,如果有人建议完全不同地解决这个问题,我很高兴,例如Pandas、numpy、openpyxl、xlrd 等

编辑:所以,我想搜索A2中的文件,找到后将其移动到B2中的文件夹,然后循环到下一行,直到文件结束。文件夹已存在于与 .xlsx 文件相同的目录中。 CSV 文件中的示例行:

File Name                    Folder Name
i_suck_at_python.xlsx        Lex sucks at Python
python_test.xlsx             Python Test

根据您的描述,我假设您正在尝试执行以下操作:

发件人:

Test 2
└── PDFs
    ├── i_suck_at_python.xlsx
    └── python_test.xlsx

收件人:

Test 2
└── PDFs
    ├── Lex sucks at Python
    │   └── i_suck_at_python.xlsx
    └── Python Test
        └── python_test.xlsx

首先,您需要在路径字符串中添加 r 前缀。这会阻止 Python 尝试转义任何反斜杠。或者,您可以改用正斜杠。

当使用 csv.reader() 时,应该使用 Python 3.x 中的 newline='' 参数打开文件,之前在 Python 2.x 中它需要 rb.

使用 in 不会测试您的文件是否存在于给定的文件夹中,而只是检查是否可以在右侧的字符串中找到左侧的字符串。要实际测试一个文件是否存在,你可以使用 os.path.exists(),但如果只是为了确保你可以复制它,那么最好在移动周围使用异常处理,即如果它找不到文件它会产生异常。

import csv
import os
import shutil

def main():
    csv_file = r"G:\Key Accounts\Ebills\Lex Bot Test\Test 2\EB Mapping.csv"
    from_folder = r"G:\Key Accounts\Ebills\Lex Bot Test\Test 2\PDFs"
    to_folder = r"G:\Key Accounts\Ebills\Lex Bot Test\Test 2\PDFs"

    with open(csv_file, 'r', newline='') as f:
        reader = csv.reader(f)

        for row in reader:
            file_name = row[0]
            folder_name = row[1]

            from_filename = os.path.join(from_folder, file_name)
            to_filename = os.path.join(to_folder, folder_name, file_name)

            try:
                shutil.move(from_filename, to_filename)
                print("Moved - '{}' -> '{}'".format(from_filename, to_filename))
            except shutil.Error as e:
                print("Failed - '{}' -> '{}'".format(from_filename, to_filename))

main()