Как записать объект серии в файл .txt без кавычек вокруг строк строки?

#python #pandas

#python #панды

Вопрос:

Я пытаюсь экспортировать объект серии в текстовый файл, в котором текстовому файлу нужен очень специфический формат. Содержимое серии — это строки, в которых объединены все столбцы фрейма данных, каждая с очень определенной длиной (дополняется пробелами или 0). Из-за этого каждая строка является строкой.

Правила форматирования:

  1. Все строки должны быть одинаковой длины. Это означает, что более короткие значения должны быть дополнены либо пробелами (буквенно-цифровыми), либо 0 (числовыми)
  2. Вывод должен быть плоским файлом (.txt)
  3. Содержимое ввода не может быть скорректировано

Используемый код:

 IPGJ_flat = IPGJ['period']
IPGJ_flat.to_csv('20201119_DAF IPGJ Test.txt', index = False)
 

Пример вывода (поддельный)

 ABCDEFGHIJK
"LMNOPQRST123456789         abcdf,gh,i           abcd"
"UVWXYZABC123456789         abc,def,gh           abcd"
UVWXYZABC123456789         abcdefghij           abcd     
 

Необходимый вывод:

 ABCDEFGHIJK
LMNOPQRST123456789         abcdf,gh,i           abcd
UVWXYZABC123456789         abc,def,gh           abcd
UVWXYZABC123456789         abcdefghij           abcd
 

Кавычки применяются только в том случае, если есть строки, в которых присутствует ‘,’.

Я уже пробовал следующее:

 IPGJ_flat = IPGJ['period'].to_frame()
IPGJ_flat.to_csv('20201119_DAF IPGJ Test.txt', index = False, sep = '|', quoting=csv.QUOTE_NONE, escapechar = ' ')
 

С вариантами seperator и escapechar, но это, похоже, портит форматирование (новые строки идентифицируются неправильно).

Есть идеи о том, как это решить?

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

1. Каков тип вашего столбца периода?

2. Столбец периода — это тип объекта

Ответ №1:

Вы пытаетесь использовать функцию CSV ( .to_csv() ) для чего-то, что явно не является CSV. Так почему бы просто не записать его в файл, не обрабатывая его как CSV?

 import pandas


# Recreating your test data
s = pandas.Series([
    "LMNOPQRST123456789         abcdf,gh,i           abcd",
    "UVWXYZABC123456789         abc,def,gh           abcd",
    "UVWXYZABC123456789         abcdefghij           abcd",
], name="ABCDEFGHIJK")


# Open a file to write to
with open("test.txt", "w") as f:

    # Write the header to file
    f.write(s.name)
    f.write("n")

    # Construct the content and write it to file
    content = "n".join(s)
    f.write(content)


# For demo purposes, show the content of the file
with open("test.txt", "r") as f:
    print(f.read())
 

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

1. Это решило проблему, спасибо! Внес небольшую корректировку, чтобы также не печатать имя серии в файле.

Ответ №2:

попробуйте ‘to_string’ вместо ‘to_csv’:

IPGJ_flat.to_string('20201119_DAF IPGJ Test.txt', index = False)

(прочитайте DataFrame.to_string()) для получения дополнительных опций.

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

1. К сожалению, это не работает. Кажется, что строки обрезаются, когда они слишком длинные, с ‘…’ в конце.

Ответ №3:

В дополнение к ответу Гийса Воббена я решил его следующим образом:

 for item in IPGJ_flat:
    with open('Test.txt','a') as f:
        f.write(item)
        f.write("n")