Как найти файл в каталоге, из списка CSV, а затем переместить этот файл в другую папку?питон - PullRequest
0 голосов
/ 16 мая 2018

У меня есть CSV-файл с строкой 1 в качестве заголовков, столбец 1 (A) - это имя файла, которое я ищу, например. i_suck_at_python.xlsx и столбец 2 (B) - это имя папки, в которую я хочу переместить ее, например. Лекс сосет у Питона.

Я сделал подобное на 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, означающему, что он не собирает файлы в папке. Еще раз спасибо.

Думаю, я должен упомянуть, что я счастлив, если кто-то предложит сделать это совершенно иначе, например, Панды, 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

1 Ответ

0 голосов
/ 17 мая 2018

Из вашего описания я предполагаю, что вы пытаетесь сделать следующее:

От:

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() файл должен быть открыт с параметром newline='' в Python 3.x, ранее в 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()
...