Python 将文件格式化为csv

Python 将文件格式化为csv,python,csv,formatting,newline,pretty-print,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

我目前有一个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 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方面的帮助

编辑


条目本身可能存在空格。我对问题进行了这样的编辑。

在Python中无法具体帮助您,但您需要做的是搜索并删除正在查找的/r/n,然后修剪得到的字符串。

文件选项卡是否有分隔符?如果是这样,您应该能够指定分隔符是一个选项卡,并且Python应该能够检测隐藏行返回(\n)。以下是文档:来自:

已编辑-发现数据来自HTML,因此我建议使用BeautifulSoup4保留数据结构。文档在此处()添加了以下示例代码:

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
从bs4导入美化组
soup=BeautifulSoup(myfile.html)#也可以是显示html的文本字符串
打印(soup.prettify())
# 
#  
#   ...
打印名称
#可以使用此格式获取要从中删除的文本的任何部分

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

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'

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

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')
]

我在text.txt文件中复制了您的文本

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

这是我的密码:

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 + ',')

我试过你的案例,但它在Dr.和A以及ABCD之间引入了逗号。有没有可能把它命名为Dr.A ABCD,abcdef,…。它实际上是一个html文件,我只是从中提取了文本。所以剩余的空间就是标签原来所在的地方。@Sarkar:嗯。。。如果直接从原始html文件中提取数据,可能更容易获得准确的数据;利用这个结构,而不是扔掉它。在这种情况下,我同意休的观点,并且认为你应该保留HTML的格式。我建议使用BeautifulSoup4来实现这一点。这是他们的链接:我正在使用这个问题的html结构,但我不能正确地获得空格