Примечание : Поскольку спрашивать как мне? вопросы по проверке кода не по теме, я попробую здесь.
Я работаю ИТ-стажером в многонациональной компании, и передо мной стояла утомительная задача - объединить многоколонный файл отчетов Excel длиной более 2500+ в поисках неактивных серверов.
Вот пример строки из этого файла:
Затем я получил другой файл Excel, но на этот раз только с кодами БД (из них более 80).
Моя задача была:
- Просмотрите большой файл отчета
- Найти компанию по коду БД
- Проверьте, является ли сервер активным или не активным, и, если он не активен, отметьте его для вывода из эксплуатации
Конечно, как и следовало ожидать, мне сказали вернуть результаты в электронной таблице в следующем формате:
Full name: Acme Inc. | Code: ACM | Active?: no | Decomm?: yes
Fulln name:, Code:, etc.
- заголовки столбцов. Здесь они только для удобства чтения.
Если бы я делал это вручную, я бы, скорее всего, умер от скуки. Но! Есть Python, верно?
Итак, я экспортировал некоторые столбцы из отчета в файл с разделителями табуляции и написал его так:
def read_file_to_list(file_name):
with open(file_name, 'r') as file_handler:
stuff = file_handler.readlines()
return [line[:-1] for line in stuff]
def make_dic(file_name):
with open(file_name, 'r') as f:
rows = (line.replace('"', "").strip().split("\t") for line in f)
return {row[0]:row[1:] for row in rows}
def search(dic, ou_codes):
c = 1
for k, v in dic.items():
for code in ou_codes:
if v[0] == code:
print("{}. Full name: {} | Code: {} | Active?: {} | Decomm?: {}".format(c, k, *v, "yes" if v[1] == "no" else "no"))
c += 1
decomm_codes = read_file_to_list('decomm_codes.txt')
all_of_it = make_dic('big_report.txt')
search(all_of_it, decomm_codes)
Это выплевывает:
1. Full name: Random, Inc | Code: RNDM | Active?: yes | Decomm?: no
2. Full name: Acme Inc.| Code: ACM | Active?: no | Decomm?: yes
3. Full name: Fake Bank, Ltd. | Code: FKBNK | Active?: yes | Decomm?: no
Вопрос:
В моем окне терминала все выглядит хорошо, но как мне записать результаты обратно в текстовый файл с разделителями табуляции? Так это выглядит так:
Acme Inc. ACM no yes
Кроме того, просто из любопытства, есть ли способ рефакторинга метода search
, например в одну строку? Понимание вложенного списка по-прежнему в моем списке TO-LEARN (каламбур).
Наконец, вот содержимое файлов decomm_codes.txt
и big_report.txt
.
decomm_codes.txt:
RNDM
ACM
FKBNK
big_report.txt:
"Random, Inc" RNDM yes
Acme Inc. ACM no
"Fake Bank, Ltd. " FKBNK yes