文件格式为csv

时间:2014-02-05 17:53:14

标签: python csv formatting newline pretty-print

我目前有一个unicode格式的文本文件,看起来像这样

Dr. A ABCD
                 abcdef

                 xyzvw

mn o p

qqq qq




Dr. E EFCD

              acdsed

               zxcve
fgh ij

kl mn o

我正在尝试将其格式化,使其看起来像这样

Dr. A ABCD,abcdef,xyzvw,mn o p,qqq qq
Dr. E EFCD,acdsed,zxcve,fgh ij,kl mn o

但我总是最终消除Dr.和A之间的空间或其间的其他空间。我试图使用split()然后“,”。join()但我总是严重格式化文件。在Python中需要一些帮助。

修改

条目本身可能存在空格。我这样编辑了这个问题。

5 个答案:

答案 0 :(得分:0)

您的文件标签是否已分隔?如果是这样,您应该能够指定分隔符是一个选项卡,Python应该能够检测隐藏的行返回(\ n)。这是文档:来自:http://docs.python.org/2/library/csv.html

import csv

with open('myfile.csv', 'rb') as myfile:

    myreader = csv.reader(myfile, delimiter='\t')

    for row in myreader:
        print ','.join(row)

已编辑 - 发现数据来自HTML,因此我建议使用BeautifulSoup4来保留数据结构。文档在这里(http://www.crummy.com/software/BeautifulSoup/bs4/doc/)在下面添加了示例代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup(myfile.html) # Can also be string of text showing HTML

print(soup.prettify())
# <html>
#  <head>
#   <title>...

print soup.title
# Can use this format to get whichever part of the text you're scraping from

答案 1 :(得分:0)

您可以使用正则表达式模块

In [19]: a = """Dr. A ABCD
             abcdef

             xyzvw

mnop

qqqqq



"""

In [20]: ','.join(re.findall('\"[^\"]*\"|\S+', a))
Out[20]: 'Dr.,A,ABCD,abcdef,xyzvw,mnop,qqqqq'

答案 2 :(得分:0)

假设所有字段都包含数据,即没有空白字段,这将起作用:

from itertools import izip_longest

# from the itertools documentation http://docs.python.org/2/library/itertools.html
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

txt = (s for s in (line.strip() for line in inf) if s)  # drop all blank lines
doctors = list(grouper(txt, 5, ''))

,在给定输入时,返回

[
    ('Dr. A ABCD', 'abcdef', 'xyzvw', 'mnop', 'qqqqq'),
    ('Dr. E EFCD', 'acdsed', 'zxcve', 'fghij', 'klmno')
]

答案 3 :(得分:0)

我将文本复制到text.txt文件中。

我只是在字符串的开头创建一个没有空格的新列表。 然后我将其打印为csv文件:用逗号分隔值,如果'博士'则添加换行符

这是我的代码:

with open('text.txt', 'r') as file:
    mytext = file.read()

splitted = mytext.split('\n')


newlist =[] 
for element in splitted:
    i=0
    for i in range(len(element)):
        if element[i] == ' ':
            pass
        else:
            newlist.append(element[i:])  #add to the list
            break

print(newlist)

with open('csv.csv', 'w') as csv:
    for element in newlist:
        if element.startswith('Dr.'):     #start a new line if 'Dr.' 
            csv.write('\n'+ element + ',')
        else:
            csv.write(element + ',')

答案 4 :(得分:-1)

无法专门用Python帮助你,但你需要做的是搜索并删除你找到的/ r / n,然后修剪你得到的字符串。