Запись в CSV на Python- строки вставлены не на своем месте

У меня есть функция, которая записывает набор информации в строках в файл CSV на Python. Функция должна добавить файл с новой строкой, однако я обнаружил, что иногда она ведет себя неправильно и помещает новую строку в отдельное пространство CSV (см. Рисунок в качестве примера).

Каждый раз, когда я переформатирую данные вручную, я снова удаляю все пустые ячейки, чтобы вы знали.

Надеюсь, кто-то может помочь, спасибо!

      def Logger():

    fileName = myDict[Sub]

    with open(fileName, 'a+', newline="") as file:
        writer = csv.writer(file)

        if file.tell() == 0:
            writer.writerow(["Date", "Asset", "Fear", "Anger", "Anticipation", "Trust", "Surprise", "Sadness", "Disgust", "Joy",
                        "Positivity", "Negativity"])
        writer.writerow([date, Sub, fear, anger, anticip, trust, surprise, sadness, disgust, joy, positivity, negativity])

2 ответа

Сначала я подумал, что это просто вопрос отсутствия конечной новой строки и добавления новой строки к той же строке, сразу после последней строки, но я могу видеть то, что выглядит как строка пустых столбцов между ними.

Вся эта штука с добавлением выглядит запутанной. Если вам не нужно использовать Python и вместо этого вы можете использовать инструмент командной строки, я рекомендую GoCSV.

Вот пример файла на основе вашего скриншота, который я скопировал:

base.csv

      Date,Asset,Fear,Anger,Anticipation,Trust,Surprise,Sadness,Disgust,Joy,Positivity,Negativity
Nov 1,5088,0.84,0.58,0.73,1.0,0.26,0.89,0.22,0.5,0.69,0.59
Nov 2,4580,0.0,0.88,0.7,0.71,0.57,0.78,0.2,0.22,0.21,0.17
Nov 3,2469,0.72,0.4,0.66,0.53,0.65,0.64,0.67,0.78,0.54,0.32,,,,,,,

Я называю это базовым, потому что это файл, который будет расти, и вы можете видеть, что у него проблема в последней строке: все эти дополнительные запятые (я не знаю, как они туда попали 🤷🏻‍♂️).

Первым шагом будет его очистка и удаление этих надоедливых лишних запятых:

      % gocsv clean base.csv > tmp
% mv tmp > base.csv

и теперь base.csv выглядит так:

      Date,Asset,Fear,Anger,Anticipation,Trust,Surprise,Sadness,Disgust,Joy,Positivity,Negativity
Nov 1,5088,0.84,0.58,0.73,1.0,0.26,0.89,0.22,0.5,0.69,0.59
Nov 2,4580,0.0,0.88,0.7,0.71,0.57,0.78,0.2,0.22,0.21,0.17
Nov 3,2469,0.72,0.4,0.66,0.53,0.65,0.64,0.67,0.78,0.54,0.32

Вот еще один набор данных, который нужно добавить, sample2.csv :

      Date,Asset,Fear,Anger,Anticipation,Trust,Surprise,Sadness,Disgust,Joy,Positivity,Negativity
Nov 4,6040,0.69,0.89,0.72,0.44,0.21,0.15,0.03,0.63,0.78,0.42
Nov 5,7726,0.72,0.12,0.95,0.6,0.88,0.1,0.43,1.0,1.0,0.68
Nov 6,9028,0.87,0.34,0.46,0.57,0.15,0.3,0.8,0.32,0.17,0.42
Nov 7,3544,0.16,0.9,0.37,0.8,0.67,0.0,0.11,0.72,0.93,0.35

Команда стекаGoCSV выполнит эту работу:

      % gocsv stack base.csv sample2.csv > tmp
% mv tmp base.csv

и теперь base.csv выглядит так:

      Date,Asset,Fear,Anger,Anticipation,Trust,Surprise,Sadness,Disgust,Joy,Positivity,Negativity
Nov 1,5088,0.84,0.58,0.73,1.0,0.26,0.89,0.22,0.5,0.69,0.59
Nov 2,4580,0.0,0.88,0.7,0.71,0.57,0.78,0.2,0.22,0.21,0.17
Nov 3,2469,0.72,0.4,0.66,0.53,0.65,0.64,0.67,0.78,0.54,0.32
Nov 4,6040,0.69,0.89,0.72,0.44,0.21,0.15,0.03,0.63,0.78,0.42
Nov 5,7726,0.72,0.12,0.95,0.6,0.88,0.1,0.43,1.0,1.0,0.68
Nov 6,9028,0.87,0.34,0.46,0.57,0.15,0.3,0.8,0.32,0.17,0.42
Nov 7,3544,0.16,0.9,0.37,0.8,0.67,0.0,0.11,0.72,0.93,0.35

Это можно записать и упростить следующим образом:

      % gocsv clean base.csv > base
% gocsv clean sample.csv > sample
% gocsv stack base sample > base.csv
% rm base sample

Попробуйте вместо этого ...

          def Logger(col_one, col_two):
        fileName = 'data.csv'

        with open(fileName, 'a+') as file:
            writer = csv.writer(file)
            file.seek(0)
            if file.read().strip() == '':
                writer.writerow(["Date", "Asset"])
            writer.writerow([col_one, col_two])
Другие вопросы по тегам