Есть ли способ, которым я могу извлечь несколько фрагментов данных из нескольких текстовых файлов в Python и сохранить его в виде строки в новом файле .csv? - PullRequest
0 голосов
/ 03 июня 2019

Есть ли способ извлечь несколько фрагментов данных из текстового файла в Python и сохранить их в виде строки в новом файле .csv?Мне нужно сделать это для нескольких входных файлов и сохранить выходные данные в виде одного файла .csv для всех входных файлов.

Я никогда раньше не использовал Python, поэтому я совершенно не в курсе.Я использовал Matlab и раньше, и я знаю, как бы я сделал это в Matlab, если бы это были цифры (но, к сожалению, это текст, поэтому я пытаюсь Python).Поэтому для ясности мне нужна новая строка в выходном файле .csv для каждого «идентификатора» во входных файлах.Пример данных показан ниже (2 отдельных файла)

EXAMPLE DATA - FILE 1:
id,ARI201803290
version,2
info,visteam,COL
info,hometeam,ARI
info,site,PHO01
info,date,2018/03/29
id,ARI201803300
data,er,corbp001,2
version,2
info,visteam,COL
info,hometeam,ARI
info,site,PHO01
info,date,2018/03/30
data,er,delaj001,0



EXAMPLE DATA - FILE 2:
id,NYN201803290
version,2
info,visteam,SLN
info,hometeam,NYN
info,site,NYC20
info,usedh,false
info,date,2018/03/29
data,er,famij001,0
id,NYN201803310
version,2
info,visteam,SLN
info,hometeam,NYN
info,site,NYC20
info,date,2018/03/31
data,er,gselr001,0

Я надеюсь получить данные в формате .csv со всеми подробностями из одного «идентификатора» в 1 строке.В текстовом файле есть несколько идентификаторов, а также несколько файлов.Я хочу повторить этот процесс для нескольких текстовых файлов, чтобы выходные данные были в одном выходном файле .csv.Я хочу, чтобы вывод в файле .csv выглядел следующим образом: каждая ячейка информации представляла собой новую ячейку:

ARI201803290 COL ARI PHO01 2018/03/29 2
ARI201803300 COL ARI PHO01 2018/03/30 0
NYN201803290 SLN NYN NYC20 2018/03/29 0
NYN201803310 SLN NYN NYC20 2018/03/31 0

Если бы я делал это в Matlab, я бы использовал цикл for и оператор ifи скажем

j=1
k=1
for i=1:size(myMatrix, 1)

if file1(i;1)==id
output(k,1)=(i;2)
k=k+1

else if 
file1(i;1)==info && file1(i;1)==info
output(j,2)=(i;3) 
j=j+1

и т.д .....

Однако я, очевидно, не могу сделать это в Matlab, потому что у меня есть текстовые файлы, разделенные запятыми, а не матрица.У кого-нибудь есть предложения, как я могу перевести свою идею в код Python?Или любое другое предложение.Я новичок в Python, поэтому хочу попробовать все, что может сработать.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 03 июня 2019

Python очень гибок и может выполнять эти задачи очень легко,

В Python есть много инструментов / модулей csv для обработки почти всех типов файлов csv и excel, однако я предпочитаю обрабатыватьCSV аналогичен текстовому файлу, потому что CSV - это просто текстовый файл с разделенным запятыми текстом, поэтому проще, чем сложнее

Ниже приведен код с комментариями для объяснения большей части его, вы можете настроить его так, чтобы он соответствовал вашемунужно ровно

import os

input_folder = 'myfolder/'  # path of folder containing the text files on your disk

# create a list with file names with their full paths using list comprehension
data_files = [os.path.join(input_folder, file) for file in os.listdir(input_folder)]

# open our csv file for writing
csv = open('myoutput.csv', 'w')  # better to open files with context manager like below but i am trying to show you different methods 

def write_to_csv(line):
    print(line)
    csv.write(line)

# loop thru your text files
for file in data_files:
    with open(file, 'r') as f:  # use context manager to open files (best practice)
        buff = []
        for line in f:
            line = line.strip()  # remove spaces and new lines
            line = line.split(',')  # split line to list of values
            if buff and line[0] == 'id':  # hit another 'id'
                write_to_csv(','.join(buff) + '\n')
                buff = []
            buff.append(line[-1]) # add the last word in line
        write_to_csv(','.join(buff) + '\n')


csv.close()  # must close any open file handles opened manually "no context manager i.e. no with"

вывод:

ARI201803290,2,COL,ARI,PHO01,2018/03/29,2
ARI201803300,2,COL,ARI,PHO01,2018/03/30,0
NYN201803290,2,SLN,NYN,NYC20,false,2018/03/29,0
NYN201803310,2,SLN,NYN,NYC20,2018/03/31,0
...