Использование Pandas для записи файла создает пустые строки

Я использую библиотеку pandas для записи содержимого базы данных mysql в файл csv.

Но когда я пишу CSV, все остальные строки остаются пустыми:

Кроме того, он печатает номера строк слева, что мне не нужно. Первый столбец должен быть "Номер счета".

Вот мой код:

destination = 'output_file.txt'
read_sql = """ SELECT LinkedAccountId,ProductName,ItemDescription,ResourceId,UnBlendedCost,UnBlendedRate,Name,Owner,Engagement FROM billing_info ;"""
fieldnames = ['Account Number', 'Product Name', 'Item Description', 'Resource ID', 'UnBlended Cost', 'UnBlended Rate', 'Name', 'Owner', 'Engagement']
# Open the file
f = open(destination, 'w')
cursor.execute(read_sql)
while True:
    # Read the data
    df = pd.DataFrame(cursor.fetchmany(1000))
    # We are done if there are no data
    if len(df) == 0:
        break
    # Let's write to the file
    else:
        df.to_csv(f, header=fieldnames)

Почему между строками с данными печатаются пустые строки? Как я могу заставить его создать файл без пустых строк и без столбца с номером строки слева?

3 ответа

Решение

Взгляните на параметры to_csv: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

Для удобства я разместил здесь несколько интересных моментов:

line_terminator: строка, необязательно

Символ новой строки или последовательность символов для использования в выходном файле. По умолчанию используется os.linesep, что зависит от ОС, в которой вызывается этот метод ("n" для linux, "rn" для Windows, т.е.).

А также

index: bool, по умолчанию True

Напишите имена строк (индекс).

Вероятно, это то, что вы ищете. Что касается пустых строк, попробуйте явно указать одну новую строку:

df.to_csv(f, header=fieldnames, index=False, line_terminator='\n')

Я пришел сюда только для названия, а не для удаления порядковых номеров. Вот почему для полноты картины я хочу добавить к принятому ответу, что удаление двойных разрывов строк выполняется простоline_terminator='\n'.

В этом примере это будет

      f = open(destination, 'w')
df.to_csv(f, line_terminator='\n')
f.close()

или при использовании «с открытым (..)»

      with open(destination, 'w') as f
    f.write(df.to_csv(line_terminator='\n'))

Другие параметры, такие как заголовки, могут быть добавлены кdf.to_csv()по мере необходимости.

Чтобы также написать пробелы междуDataFrame,

      import pandas as pd
import numpy as np


with open('report_.csv', 'w') as f:
    for _ in range(4):  # loop here
        df = pd.DataFrame(np.random.random((3,4)))

        df.to_csv(f,
                  index=True,  # to include index
                  header=True,  # to include header
                  lineterminator='\n',  # to remove whitespace between row
                 )
        f.write('\n')  # remove this to delete whitespace between DataFrame
Другие вопросы по тегам