Мой код писателя CSV записывает разделители между символами, а не строки - PullRequest
0 голосов
/ 11 мая 2018

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

import csv
def csv_reader(file,path):
    with open(path, 'w') as f1, open(file, 'r') as f2:
        write = csv.writer(f1, delimiter=',')
        read  = csv.reader((line.replace('\0','') for line in f2), delimiter="\t")
        i=1
        for row in read:
            if(len(row)==0):
                continue
            if(row[3]=="Trade"):
                continue
            else:
                if(row[6]==""):
                    r = [row[0],row[0],'A',row[8],row[9],row[0]]
                    line = ','.join(r)
                    print(line)
                    write.writerow(line)
                else:
                    r = [row[0],row[0],'B',row[6],row[7],row[0]]
                    line = ','.join(r)
                    print(line)
                    write.writerow(line)
if __name__ == "__main__":
    path = "sales.csv"
    csv_path = "FlowEdge-TRTH-Time_Sales.csv"
    csv_reader(csv_path,path)

Это показывает вывод как:

    0,7,0,0,4,5,0,0,0,0,C,8,.,H,K,",",0,7,0,0,4,5,0,0,0,0,C,8,.,H,K,",",B,",",5,.,7,",",4,",",0,7,0,0,4,5,0,0,0,0,C,8,.,H,K

, в то время как это должно быть похоже:

    0700450000C8.HK,0700450000C8.HK,B,5.7,4,0700450000C8.HK

когда я делаю следующую модификацию

   write.writerow([line])

Она показывает полную строку в одном столбце файла Excel, означая, что есть только один столбец, а я хочу 6 столбцов.

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Спасибо всем, но я нашел ошибку в своем коде

    read  = csv.reader((line.replace('\0','') for line in f2), delimiter="\t")

Это была ошибка, так как я использовал табуляцию в качестве разделителя в CSV-файле.

Исправлено на

    read  = csv.reader((line.replace('\0','') for line in f2), delimiter=",")
0 голосов
/ 11 мая 2018

Если вы просто хотите прочитать определенный набор столбцов из одного .csv файла и вывести их в другой файл, вы можете попробовать pandas module.

import pandas as pd

data = pd.read_csv('to_load.csv', usecols=['col1', 'col2'])
data.to_csv('to_save.csv', index=False)

Что он делаетсначала он загружает csv в переменную с именем data.Импортируются только те столбцы, которые вы определили в usecols.Вы можете ссылаться на столбцы по их именам или по индексу (например, вы можете usecols=[0, 1, 2] - это импортирует первые 3 столбца).

Затем переменная может быть легко сохранена в файл csv снова благодаря методу .to_csv.

0 голосов
/ 11 мая 2018

Функция csv.writerow() берет список элементов и записывает его в ваш файл с необходимыми разделителями (по умолчанию это запятая). Так, например:

Список ['a', 'b', 'c'] записывается в файл как a,b,c

import csv

def csv_reader(file,path):
    with open(path, 'w', newline='') as f_output, open(file, 'r', newline='') as f_input:
        csv_output = csv.writer(f_output)
        csv_input = csv.reader((line.replace('\0', '') for line in f_input))

        for row in csv_input:
            if len(row) and row[3] != "Trade":
                if row[6] == "":
                    output_row = [row[0], row[0], 'A', row[8], row[9], row[0]]
                else:
                    output_row = [row[0], row[0], 'B', row[6], row[7], row[0]]

                print(','.join(output_row))
                csv_output.writerow(output_row)

if __name__ == "__main__":
    path="sales.csv"
    csv_path = "FlowEdge-TRTH-Time_Sales.csv"
    csv_reader(csv_path, path)

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

0 голосов
/ 11 мая 2018

Проблема здесь:

line=','.join(r)
print(line)
write.writerow(line)

Метод writerow хочет получить список столбцов.Он будет добавлять запятые между столбцами (и заключать в кавычки или экранировать все, что нужно, и т. Д.).

Но вы не предоставляете ему список столбцов;вы даете ему одну строку.Вот что делает ','.join(r): превращает список столбцов в одну строку, разделенную запятыми.

Когда вы задаете writerow строку, а не список строк, она обрабатывает строку как последовательностьперсонажи.(Это не относится к csv; в Python строка представляет собой последовательность символов.) Таким образом, он обрабатывает каждый символ как столбец и добавляет запятые между ними.

Просто выполнитеэто:

write.writerow(r)
...