Я новичок в Python и надеюсь получить некоторую помощь в переводе моего псевдокода в реальный код. В настоящее время у меня есть скрипт Python, который выполняет следующее:
Я хочу настроить аргумент командной строки, который является необязательным, но, если он задан, вместо этого будет записывать 0 или 1 в выходной файл с именем «output.csv», а не в файл данных.
В настоящее время создается output.csv, но не только с классификацией 1 или 0. По сути, он перезаписывает весь файл data.csv (который читается) в output.csv (который должен быть записан)
Я новичок в Python и надеюсь получить некоторую помощь в переводе моего псевдокода в реальный код. В настоящее время у меня есть скрипт Python, который выполняет следующее:
Я хочу настроить аргумент командной строки, который является необязательным, но, если он задан, вместо этого будет записывать 0 или 1 в выходной файл с именем «output.csv», а не в файл данных.
Как я могу отредактировать мой текущий скрипт, чтобы не перезаписывать весь файл data.csv, а только индикатор isBad 0 или 1?
import re
import csv
import codecs
import argparse
#Configuring arguments and variables
################################################
parser = argparse.ArgumentParser(description='This script is used to automatically classify the workbench operations. If the operation was performed by a human, it will be marked appropriately. If it was done by a machine, it will be marked appropriately.')
parser.add_argument('-d', '--data', required=True, help='The data.csv produced by the workbench')
parser.add_argument('-r', '--log', required=True, help='The log file used to appropriately label the data')
parser.add_argument('-n', '--new', required=False, help='Flag to create output.csv of markings instead of marking data.csv', action = "store_true")
args = parser.parse_args()
if (args.new):
print("You selected to create a new log")
print('data.csv:', args.data)
print('log:', args.log)
filepath = args.log
csv_filepath = args.data
tempStart = ''
tempEnd = ''
################################################
print(" ")
print("Starting Script")
print(" ")
#open the log
with open(filepath) as myFile:
#read the log
all_logs = myFile.read()
myFile.close()
#Create regular expressions
starting_regex = re.compile(r'\[(\d+)\s+s\]\s+Initializing\s+Workbench')
ending_regex = re.compile(r'\[(\d+)\s+s\]\s+Log\s+File\s+Completed.\s+Stopping!')
#Create arrays of start and end times
start_times = list(map(int, starting_regex.findall(all_logs)))
end_times = list(map(int, ending_regex.findall(all_logs)))
#Create 2d Array
timeArray = list(map(list, zip(start_times, end_times)))
#Print 2d Array
print(timeArray)
print(" ")
print("Completed timeArray construction")
print(" ")
#Open the csv file as a reader
with open(csv_filepath, 'rb') as csvfile:
reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))
input_rows = [row for row in reader]
#Open the csv file as a writer
with open('output.csv', 'w') as outputfile:
writer = csv.writer(outputfile)
# loop through the rows, set the currVal to the value of the first column (timestamp)
for row in input_rows:
currVal = int(row[0])
isBad = '0'
for interval in timeArray:
if interval[0] <= currVal <= interval[1]:
isBad = '1'
break
writer.writerow(row + [isBad])
print("Script completed")
Также для создания нового файла: stackoverflow.com/questions/48959098/…
Спасибо за ваш отзыв, SPYBUG96. Я думаю, что ответ может быть принят как объединение двух ваших комментариев, но я считаю, что это не дубликат, поскольку конкретное приложение здесь уникально для обеих ссылок.
Сделайте new-log аргументом store_true. Его значение по умолчанию будет False, а если задано - True. Как написано, для него требуется аргумент со значением по умолчанию None.
При отладке приложений argparse рекомендуется использовать print(args), чтобы точно видеть, что синтаксический анализатор произвел для различных входных данных. Таким образом, вы не будете гадать, когда попытаетесь использовать args в своем коде.
@hpaulj, забавно, что ты их прокомментировал. Я ПРОСТО добавил это в аргументе (store_true) на основе: docs.python.org/3/howto/argparse.html






После достаточной отладки я нашел строку, которую нужно было изменить. writer.writerow(row + [isBad]) должен был быть writer.writerow([isBad])
Возможный дубликат Проверьте, установлен ли необязательный аргумент argparse или нет