在python中解析带换行符的文本文件

时间:2017-05-20 02:21:41

标签: python parsing

我有一个包含大约20个条目的文本文件。它们看起来像这样:

~

England
Link: http://imgur.com/foobar.jpg
Capital: London
~
Iceland
Link: http://imgur.com/foobar2.jpg
Capital: Reykjavik
...

我想将这些条目转换为CSV格式。 有一个'〜'分隔每个条目。我试图弄清楚如何逐行扫描并为每个国家/地区创建CSV值。谁能给我一个如何解决这个问题的线索?

3 个答案:

答案 0 :(得分:3)

使用库luke :) 我假设您的数据格式正确。大多数现实世界的数据都不是这样的。所以,这里有一个解决方案。

>>> content.split('~')
['\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n', '\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n']

为了编写CSV,Python具有标准库函数。

>>> import csv
>>> csvfile = open('foo.csv', 'wb')
>>> fieldnames = ['Country', 'Link', 'Capital']
>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
>>> for entry in entries:
...   cols = entry.strip().splitlines()
...   writer.writerow({'Country': cols[0], 'Link':cols[1].split(': ')[1], 'Capital':cols[2].split(':')[1]})
... 

如果您的数据更加半结构化或格式错误,请考虑使用PyParsing之类的库。

修改 第二列包含URL,因此我们需要很好地处理拆分。

>>> cols[1]
'Link: http://imgur.com/foobar2.jpg'
>>> cols[1].split(':')[1]
' http'
>>> cols[1].split(': ')[1]
'http://imgur.com/foobar2.jpg'

答案 1 :(得分:0)

我这样做的方法是使用open()函数,使用以下语法:

f = open('NameOfFile.extensionType', 'a+')

“a +”是附加模式。该文件不会被覆盖,可以追加新数据。您也可以使用“r +”以读取模式打开文件,但会失去编辑功能。字母后面的“+”表示如果文档不存在,则会创建该文档。 “a +”我没有找到工作而没有“+”。

之后我会像这样使用for循环:

data = []
tmp = []
for line in f:
  line.strip() #Removes formatting marks made by python
  if line == '~':
    data.append(tmp)
    tmp = []
    continue
  else:
    tmp.append(line)

现在您已将所有数据存储在列表中,但您也可以使用稍微不同的算法将其重新格式化为类对象。

我从未使用python编辑过CSV文件,但我相信你可以使用这样的循环来添加数据:

f2 = open('CSVfileName.csv', 'w') #Can change "w" for other needs i.e "a+"
for entry in data:
  for subentry in entry:
    f2.write(str(subentry) + '\n') #Use '\n' to create a new line

根据我对CSV的了解,循环将创建所有数据的单列。最后记得关闭文件以保存更改:

f.close()
f2.close()

您可以将两个循环合并为一个以节省空间,但为了解释起见我没有。

答案 2 :(得分:-1)

import csv

datafile = 'unparsed_countries.txt'
new_file = 'parsed_countries.csv'
with open(datafile, 'r') as f:
    data = []
    country = []

    for line in f:
        line = line.strip()
        if line == '~':
            data.append(country)
            country = []
        else:
            country.append(line)

with open(new_file, 'w', newline='\n') as myfile:
    wr = csv.writer(myfile, lineterminator='\n', delimiter=',')
    wr.writerows(data)



Output file:

England,Link: http://imgur.com/foobar.jpg,Capital: London
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik
England,Link: http://imgur.com/foobar.jpg,Capital: London
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik