【问题标题】:File Formatting to csv文件格式为 csv
【发布时间】:2014-02-05 17:53:14
【问题描述】:

我目前有一个 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 方面需要一些帮助。

编辑

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

【问题讨论】:

    标签: python csv formatting newline pretty-print


    【解决方案1】:

    可以使用正则表达式模块

    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'
    

    【讨论】:

    • 我试过你的情况,但它在 Dr. 和 A 和 ABCD 之间引入了逗号。能不能把它写成 Dr. A ABCD,abcdef,....
    【解决方案2】:

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

    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】:

      你的文件制表符是分隔的吗?如果是这样,您应该能够指定分隔符是一个制表符,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
      

      【讨论】:

      • 它实际上是一个 html 文件,我只从中提取了文本。所以剩余的空间是标签曾经所在的地方。
      • @Sarkar:呃……如果直接从原始html文件中提取数据,可能会更容易获得准确的数据;利用结构而不是丢弃它。
      • 在这种情况下,我同意 Hugh 的观点,并认为您应该保留 HTML 的格式。我建议使用 BeautifulSoup4 来做到这一点。这是他们的链接:crummy.com/software/BeautifulSoup/bs4/doc
      • 我正在使用这个问题的 html 结构stackoverflow.com/questions/21581147/…,但我无法正确填写空格
      【解决方案4】:

      我将您的文本复制到一个 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 + ',')
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 2018-09-03
          • 2019-07-01
          • 2016-03-01
          • 2018-01-17
          • 2018-07-10
          相关资源
          最近更新 更多