2016-12-10 2 views
0

У меня много csv с # разделителем, и я хочу применить «текст к столбцам» для всех из них с помощью python.auto text to columns multiple csv using python

К примеру, у меня есть файл «filename.csv», который выглядит как 1 # 2 # 3 # 4

И я хочу, чтобы переписать его в том же файле, так что бы выглядеть следующим образом: но каждое число в своей собственной колонке

Мой код на данный момент является:

import csv 
with open('filename.csv', 'rb') as csvfile: 
      with open('out.csv','w') as csvfileout: 
      spamreader = csv.reader(csvfile, delimiter='#', quotechar='#') 
      spamwriter=csv.writer(csvfileout,delimiter='#',quotechar=' ') 
      for row in spamreader: 
        lines=' '.join(row) 
        csvfileout.write(lines) 

И мой вывод просто неправильно. Не могли бы вы помочь мне, что случилось в моем коде?

ответ

2

Просто измените разделитель, а не катчар.

И вы можете «труба», вход непосредственно к выходу, сохраняя данные в виде строк (вы вручную создать строку с join, который является ненужным):

import csv 
with open('filename.csv', 'r') as csvfile, open('out.csv','w') as csvfileout: 
    spamreader = csv.reader(csvfile, delimiter='#') 
    spamwriter = csv.writer(csvfileout,delimiter=' ') 
    spamwriter.writerows(spamreader) 

к сведению, что некоторые питона 2 версии нужно wb для выходного файла, а некоторые версии python 3 требуют дополнительного параметра newline='' при открытии файла для записи.

Оба варианта не нужны с последними релизами python (2 или 3).

+0

спасибо. , но все же есть проблема - когда я использую excel, чтобы увидеть это, это не в отдельных столбцах, а только в одной ячейке. Есть ли способ справиться с этим? – S3xCodeandRocknRoll

+0

Вместо 'delimiter = ''', попробуйте 'dialect = csv.excel' и без разделителя – Gribouillis

+0

excel открывает файлы csv с помощью;; или "," в зависимости от версии, но не в пространстве. –

0

Вы можете добиться этого с помощью команды linux sed очень легко.

Сначала проверьте, если его работы так:

sed 's/#/ /g' filename 

Если это работает, то вы можете заменить все # с space как так:

для одного файла в текущей папке

sed -i 's/#/ /g' filename 

для всех файлов в текущей папке

sed -i 's/#/ /g' ./*