Запись одного списка в csv по столбцам

#python

Вопрос:

Следующий код выполняет поиск слов, указанных в списке, и при совпадении записывает строку в csv строку за строкой.

Я пытаюсь найти решение, чтобы вместо записи только по строкам 1-й элемент в списке был столбцом 1, а 2-й-столбцом 2 и так далее.

 parm_list = ["electricalAntennaTilt ","iuantSectorId ", "eUtranCellFDDId "]
os.remove("Parm.csv")
#keyword = input("Enter keyword here: ")
with open('Parm.csv', 'w', newline='n', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["eNB", "Parameter", "Value"])

for filename in os.listdir(directory):
    for i in parm_list:
        if filename.endswith(".txt"):
            with open(filename, "r", encoding="UTF-8") as file:
                for line in file:
                    if re.search(i, line):
                        with open('Parm.csv', 'a', newline='n', encoding='utf-8') as csvfile:
                            writer = csv.writer(csvfile)
                            writer.writerow([filename]   [line])


    else:
        continue
 

Выходной ток:

 315655.txt electricalAntennaTilt                30

315655.txt iuantSectorId                        315655_1_4
 

Ожидаемый результат:

 315655.txt electricalAntennaTilt                30 iuantSectorId                        315655_1_4
 

Ответ №1:

Я не вижу ваших txt-файлов, так что просто предположение:

 import csv
import os
import re

directory = "~/Desktop" # put here a path to your directory

parm_list = ["electricalAntennaTilt ","iuantSectorId ", "eUtranCellFDDId "]
os.remove("Parm.csv")
#keyword = input("Enter keyword here: ")
with open("Parm.csv", "w", newline="n", encoding="utf-8") as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["eNB", "Parameter", "Value"])

for filename in os.listdir(directory):
    if filename.endswith(".txt"):
        row = [filename] # <--------- make a row for every file
        for i in parm_list:
            with open(filename, "r", encoding="UTF-8") as file:
                for line in file:
                    if re.search(i, line):
                        row.append(line) # < ----- fill the row

         # write the row to the csv file
         with open("Parm.csv", "a", newline="n", encoding="utf-8") as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(row)
 

Ответ №2:

Почему вы каждый раз закрываете файл? Кроме того, попробуйте вместо этого выполнить итерацию параметров ( parm_list ) во внутреннем цикле:

 parm_list = ["electricalAntennaTilt ","iuantSectorId ", "eUtranCellFDDId "]
os.remove("Parm.csv")
#keyword = input("Enter keyword here: ")
with open('Parm.csv', 'w', newline='n', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=["eNB"]   parm_list) 
    writer.writeheader()

    for filename in os.listdir(directory):
        if filename.endswith(".txt"):
            with open(filename, "r", encoding="UTF-8") as file:
                data = {'eNB': filename}
                for line in file:
                    if data.keys() > set(parm_list):
                        break
                    for pattern in parm_list:
                        if pattern not in data and re.search(pattern, line):
                            data[pattern] = line.strip()

                writer.writerow(data)                         
 

Комментарии:

1. Спасибо, мэдберд. Ваш код работает, за исключением того, что он приводит только к первому экземпляру слова в файле, а не ко всем из них.

2. Мне непонятно, как вы собираетесь справляться с ситуацией, когда есть несколько ключевых слов, приписываемых метрике 1, и ни одно из них не относится к метрике 2. Так что я не уверен, чем могу вам в этом помочь.

Ответ №3:

Не уверен, что это то, что вы ищете, но измените

 with open('Parm.csv', 'a', newline='n', encoding='utf-8') as csvfile:
 

Для

 with open('Parm.csv', 'a', newline='', encoding='utf-8') as csvfile:
 

во втором цикле.

Комментарии:

1. Спасибо арун чанд, к сожалению, это не дает мне того результата, который я ищу.