Сохранение отформатированных данных, разделенных вертикальными чертами (с разделителями каналов), в файл в Python - PullRequest
0 голосов
/ 07 апреля 2020
    # Get the filepath from the command line
import sys
F1= sys.argv[1] 
F2= sys.argv[2]



"""load the two files for processing"""
action_log=[]
#open first file
with open(F1, 'r') as accounts_file:
  main_log = accounts_file.read().splitlines()
  split_main_log = [word.split('|') for word in main_log]

#open second file
with open(F2, 'r') as command_file:
  command_log = command_file.read().splitlines()
  split_command_file = [word.split('|') for word in command_log]


for i in range(0, len(split_command_file)):
  if (split_main_log[i][1] == split_command_file[i][3] and split_command_file[i][0] == 'sub'):
    if split_main_log[i][2] >= split_command_file[i][1]:
      split_main_log[i][2] = int(split_main_log[i][2]) - int(split_command_file[i][1])
  elif split_main_log[i][1] == split_command_file[i][3] and split_command_file[i][0] == 'add':
    split_main_log[i][2] = int(split_main_log[i][2]) + int(split_command_file[i][1])

    for i in range(0,len(split_main_log)):
      split_main_log[i] = str(split_main_log[i])


for i in range(0,len(split_main_log)):
  split_main_log[i]='|'.join(split_main_log[i])
output_new = ""
output_new = "\n".join(split_main_log)



 out_file = open(F1,'w') #openfile
 out_file.write(output_new)

Я не уверен, почему мой вывод имеет так много вертикальных полос. Я просто что-то упускаю из виду и мне нужно еще один взгляд на это (был на этом в течение нескольких часов). Любая помощь будет потрясающей.

enter image description here

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Как насчет использования CSV? и просто сказать писателю csv использовать знак канала в качестве разделителя?

import csv

with open("test.csv", "w", newline='') as csv_file:
        csv_writer = csv.writer(csv_file, delimiter='|')
        csv_writer.writerow(["ColumnName1", "ColumnName2", "ColumnName3"])
        for i in listOfDictionary:
            csv_writer.writerow([i["key1"], i["key2"], i["key3"]])
0 голосов
/ 07 апреля 2020

Код вставляет | между каждым символом, поскольку он передает str в качестве аргумента join. Метод str.join принимает последовательность в качестве аргумента и возвращает str, который является каждым элементом последовательности, отделенным экземпляром, который вызвал join. Вы можете продемонстрировать это для себя, запустив '|'.join('foobarbaz').

. Вы можете начать с удаления этого приведения в str:

    for i in range(0,len(split_main_log)):
      split_main_log[i] = str(split_main_log[i])

Это, вероятно, прервет вызов str.join, поскольку вы Вы переводите значения в int в родительском for l oop. Вам нужно будет привести эти значения к str после того, как вы закончите с арифметикой c, например:

for i in range(0, len(split_command_file)):
  if (split_main_log[i][1] == split_command_file[i][3] and split_command_file[i][0] == 'sub'):
    if split_main_log[i][2] >= split_command_file[i][1]:
      split_main_log[i][2] = str(int(split_main_log[i][2]) - int(split_command_file[i][1]))
  elif split_main_log[i][1] == split_command_file[i][3] and split_command_file[i][0] == 'add':
    split_main_log[i][2] = str(int(split_main_log[i][2]) + int(split_command_file[i][1]))

Пожалуйста, предоставьте минимальный воспроизводимый образец, и я могу помочь больше. Это трудно отладить без входных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...