如何从 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()
我有一个 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()