Преобразовать из пробела в запятую и изменить порядок значений Python

#python

#python

Вопрос:

У меня есть файл .csv со многими строками и структурой:

 YYY-MM-DD HH first_name quantity_number second_name first_number second_number third_number
  

У меня есть скрипт на python для преобразования разделителя из пробела в запятую, и он работает нормально.

 import csv
with open('file.csv') as infile, open('newfile.dat', 'w') as outfile:
    for line in infile:
        outfile.write(" ".join(line.split()).replace(' ', ','))
  

Мне нужно изменить в newfile.dat позицию каждого значения, например, поместить значение HH в позицию 6, значение second_name в позицию 2 и т.д.

Заранее спасибо за вашу помощь.

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

1. Пожалуйста, разместите свой код, сделав отступ в каждой строке на 4 пробела с новой строкой до и после вашего кода.

2. В чем заключается ваш вопрос? SO не является бесплатным генератором кода. Мы не делаем вашу работу за вас.

3. Возможно, вам окажется проще использовать встроенный csv пакет, а не разбирать и записывать файл вручную.

Ответ №1:

Если вы импортируете csv , можете также использовать это

 import csv
with open('file.csv', newline='') as infile, open('newfile.dat', 'w ', newline='') as outfile:
    read = csv.reader(infile, delimiter=' ')
    write = csv.writer(outfile) #defaults to excel format, ie commas
    for line in read:
        write.writerow(line)
  

Используйте newline='' при открытии файлов csv, иначе вы получите файлы с двойным интервалом.

Это просто записывает строку так, как она есть во входных данных. Если вы хотите изменить это перед записью, сделайте это в for line in read: цикле. line это список строк, порядок которых вы можете изменить любым количеством способов.

Один из способов изменить порядок значений — использовать operator.itemgetter :

 from operator import itemgetter
getter = itemgetter(5,4,3,2,1,0) #This will reverse a six_element list
for line in read:
     write.writerow(getter(line))
  

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

1. OP хочет изменить значение перед записью в файл — необходимо изменить в newfile.dat позицию каждого значения, например, поместить значение HH в позицию 6, значение second_name в позицию 2 и т. Д

2. @DineshPundkar, не зная точного преобразования, которое он ищет, трудно помочь.

3. @DineshPundkar, да, мне только нужно изменить положение значений. Значения продолжаются с тем же значением исходного файла, но в другой позиции в новом файле.

Ответ №2:

Чтобы изменить порядок элементов, основным способом может быть следующее:

 split_line = line.split(" ")
column_mapping = [9,6,3,7,3,2,1]
reordered = [split_line[c] for c in column_mapping]
joined = ",".join(reordered)
outfile.write(joined)
  

Это разбивает строку, упорядочивает ее в соответствии с column_mapping , а затем объединяет ее обратно в одну строку (через запятую)

(в вашем коде не включайте column_mapping в цикл, чтобы избежать его повторной инициализации)