Как использовать sed для преобразования текстового файла в файл CSV с использованием Python - PullRequest
0 голосов
/ 16 марта 2012

Я пытался преобразовать этот формат:

2012-03-16 13:47:30.465 -0400   START  Running    Lab.script    19    on_the

Единственный способ понять это - использовать sed, однако, когда я пытаюсь использовать подпроцесс в python, он не читает правильную команду и выдает ошибку. Кроме того, это не тот формат, я бы хотел, чтобы он был похож на CSV.

Это то, с чем я сейчас работаю:

   f = open("newlogfile.csv", "w")
   p = subprocess.Popen(["sed","-e","'s/^[ ]*//g'","-e","'s/\([0-9a-zA-Z\.]*\)","*/\1;/g'","LogFile.txt"], stdout=f, stderr=f)

   f.close()

Я довольно новичок в использовании подпроцесса и очень плохо знаком с sed, любая помощь будет признательна.

Заранее спасибо

UPDATE:

  fin = csv.reader(open('LogFile.txt', 'rb'),delimiter='\t')
  fout = csv.writer(open('newLogFile.csv', 'w'))

  for row in fin:
    fout.writerow(';'.join(row))

1 Ответ

0 голосов
/ 16 марта 2012

Вы действительно должны заглянуть в модуль csv для более чистого способа сделать это преобразование, я думаю, вам понадобится код, который выглядит примерно так:

fin = csv.reader(open('LogFile.txt', 'rb'), delimiter='\t')
fout = open('newLogFile.csv', 'w')
for row in fin:
    fout.write(';'.join(row) + '\n')

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

Попробуйте изменить список команд на следующее:

["sed", "-e", "s/^[ ]*//g", "-e", "s/\([0-9a-zA-Z\.]*\)*/\1;/g", "LogFile.txt"]

Обратите внимание, что второй s/.../.../g был разбит на две записи в исходном примере, что, вероятно, стало причиной проблемы.Также вам не нужны одинарные кавычки, потому что Popen сделает все, что необходимо для экранирования, чтобы передать всю запись в списке аргументов в sed в качестве единственного аргумента.

Вам также следует заменить stderr=fstderr=subprocess.STDOUT, который является правильным способом отправки stderr в то же место, что и stdout.

Полный код:

f = open("newlogfile.csv", "w")
args = ["sed", "-e", "s/^[ ]*//g", "-e", "s/\([0-9a-zA-Z\.]*\)*/\1;/g", "LogFile.txt"]
p = subprocess.Popen(args, stdout=f, stderr=subprocess.STDOUT)
f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...