2016-01-08 2 views
0

Ive файл csv, который я хотел бы получить все строки в одном столбце. Ive попытался импортировать в MS Excel или форматировать его с Notedpad ++. Однако при каждой попытке он рассматривает часть данных как новую строку. Как я могу форматировать файл с помощью модуля csv pythons так, чтобы он удалял строку «BRAS» и исправлял формат. Каждая строка находится между цитатой "и разделителем является трубой | Update:.python csv формат всех строк в одну строку

"aa|bb|cc|dd| 
ee|ff" 
"ba|bc|bd|be| 
bf" 
"ca|cb|cd| 
ce|cf" 

выше должен быть 3 строкой, однако мои редактора рассматривают их как 5 рядов или 6 и так далее

.
import csv 
import fileinput 


with open('ventoya.csv') as f, open('ventoya2.csv', 'w') as w: 
    for line in f: 
     if 'BRAS' not in line: 
      w.write(line) 

NB Я получаю ошибку юникода при попытке использовать в питона

return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 18: character maps to <undefined> 
+0

Хорошо сделал надежду обновления, которая дает более четкую идею. – BKCapri

+0

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

+1

Это не файл с разделителями-запятыми (CSV), а файл с разделителями. Если разрывы строк незначительны, их можно удалить с помощью поиска и заменить, например, Microsoft Word, используя опцию форматирования. Вам нужно прочитать файл, используя функцию, в которой вы указываете разделитель как '|', иначе вы можете искать и заменять '|' на ','. – noumenal

ответ

1

Это быстрый взлом для небольших входных файлов (содержимое считывается в память).

#!python2 

fnameIn = 'ventoya.csv' 
fnameOut = 'ventoya2.csv' 
with open(fnameIn) as fin, open(fnameOut, 'w') as fout: 
    data = fin.read()    # content of the input file 
    data = data.replace('\n', '') # make it one line 
    data = data.replace('""', '|') # split char instead of doubled "" 
    data = data.replace('"', '') # remove the first and last " 
    print data 
    for x in data.split('|'):  # split by bar 
     fout.write(x + '\n')  # write to separate lines 

Или если цель только закрепить дополнительные (нежелательные) строку, чтобы сформировать файл CSV один столбец, файл может быть зафиксирован первый, а затем прочитать через модуль CSV:

#!python2 
import csv 

fnameIn = 'ventoya.csv' 
fnameFixed = 'ventoyaFixed.csv' 
fnameOut = 'ventoya2.csv' 

# Fix the input file. 
with open(fnameIn) as fin, open(fnameFixed, 'w') as fout: 
    data = fin.read()     # content of the file 
    data = data.replace('\n', '')  # remove the newlines 
    data = data.replace('""', '"\n"') # add the newlines back between the cells 
    fout.write(data) 

# It is an overkill, but now the fixed file can be read using 
# the csv module. 
with open(fnameFixed, 'rb') as fin, open(fnameOut, 'wb') as fout: 
    reader = csv.reader(fin) 
    writer = csv.writer(fout) 
    for row in reader: 
     writer.writerow(row) 
+0

Спасибо так много каждый раз, когда я застреваю в unicode-ошибке. «UnicodeDecodeError: кодек« charmap »не может декодировать байт 0x8f в позиции 18: карты символов до ». Что дальше я должен смотреть и пытаться сделать? – BKCapri

+0

Какую версию Python вы используете? Какую кодировку использует файл? Вы должны отражать это при открытии файла. В Python 3 вы должны передать кодировку = 'xxx', в Python 2 это делается по-другому. В этом случае вы, вероятно, используете Python 3. – pepr

+0

После прочтения я обнаружил, что поэтому я ушел на python 2. Еще одна вещь, которую я забыл упомянуть, заключается в том, что исходный код имеет некоторый HTML, следовательно, также имеет «промежуточный». кодирование UTF-8. – BKCapri

0

для решения этого вам нужно не идти даже код 1:.. Просто откройте файл в Notepad ++ 2: В первой строке выберите из | symble до следующей строки 3: замените и замените выбранный формат |

Режим поиска может быть нормальным или продлены :)

0

Ну, так как разрывы строк последовательны, вы можете пойти и сделать найти/заменить, как это предлагается, но вы также можете сделать быструю конвертацию с питона скрипт :

import csv 
import fileinput 

linecount = 0 
with open('ventoya.csv') as f, open('ventoya2.csv', 'w') as w: 
    for line in f: 
     line = line.rstrip() 

# remove unwanted breaks by concatenating pairs of rows    

     if linecount%2 == 0: 
      line1 = line 
     else: 
      full_line = line1 + line 

      full_line = full_line.replace(' ','') 
# remove spaces from front of 2nd half of line 

# if you want comma delimiters, uncomment next line: 
#   full_line = full_line.replace('|',',') 

     if 'BRAS' not in full_line: 
      w.write(full_line + '\n') 
    linecount += 1 

Это работает для меня с тестовыми данными, и если вы хотите, чтобы изменить разделители при записи в файл, вы можете. Самое приятное в том, что вы делаете код: 1. Вы можете сделать это с помощью кода (всегда весело) и 2. Вы можете одновременно удалить разрывы строк и фильтровать контент в файл.

+0

Благодаря получать ту же ошибку Юникода « возвращение codecs.charmap_decode (вход, self.errors, decoding_table) [0] UnicodeDecodeError:„CharMap“кодек не может декодировать байт 0x8F в позиции 18: символ сопоставляется <не определено» – BKCapri

Смежные вопросы