2014-02-05 67 views
0

我现在必须以Unicode格式的文本文件,它看起来像这样文件格式为csv

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 

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

编辑

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

回答

-1

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

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 
+0

它实际上从我只提取文本的HTML文件。所以剩余空间是标签曾经是的。 –

+2

@Sarkar:呃...如果您直接从原始HTML文件中提取数据,可能会更容易获取准确的数据;利用结构而不是扔掉它。 –

+0

在这种情况下,我同意休,并认为你应该保持HTML的格式。我建议使用BeautifulSoup4来做到这一点。这里是他们的链接:http://www.crummy.com/software/BeautifulSoup/bs4/doc/ – Will

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' 
+0

我试过你的情况,但它介绍了博士和A和ABCD之间的逗号。是否有可能把它当作Dr. A ABCD,abcdef,.... –

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