我有一个包含大约20个条目的文本文件。它们看起来像这样:
~
England
Link: http://imgur.com/foobar.jpg
Capital: London
~
Iceland
Link: http://imgur.com/foobar2.jpg
Capital: Reykjavik
...
等
我想将这些条目转换为CSV格式。 有一个'〜'分隔每个条目。我试图弄清楚如何逐行扫描并为每个国家/地区创建CSV值。谁能给我一个如何解决这个问题的线索?
答案 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