我有一个运行到20,000行的文本文件。一块有意义的数据对我来说将包括姓名,地址,城市,州,邮编,电话。我的文件在新行上都有,所以文件就像:
StoreName1
, Address
, City
,State
,Zip
, Phone
StoreName2
, Address
, City
,State
,Zip
, Phone
我需要创建一个CSV文件,并且需要在一行中为每个商店提供上述信息:
StoreName1, Address, City,State,Zip, Phone
StoreName2, Address, City,State,Zip, Phone
基本上,我试图仅在适当的时候删除\ r \ n。我如何使用python re执行此操作。例子非常有用,我是新手。
感谢。
答案 0 :(得分:3)
s/[\r\n]+,/,/g
全球用','
代替'linebreak(s)'编辑:
如果您想通过记录之间的单个换行符进一步减少它:
s/[\r\n]+(,|[\r\n])/$1/g
用捕获组1全局替换'linebreaks(s)(逗号或换行符)。
编辑:
并且,如果真的失控了,这可能会治愈它:
s/[\r\n]+\s*(,|[\r\n])\s*/$1/g
答案 1 :(得分:2)
此迭代器/生成器版本不需要立即将整个文件读入内存
from itertools import groupby
with open("inputfile.txt") as f:
groups = groupby(f, key=str.isspace)
for row in ("".join(map(str.strip,x[1])) for x in groups if not x[0]):
...
答案 2 :(得分:1)
假设数据“正常” - 请参阅我的评论 - 我会以这种方式解决问题:
with open('data.txt') as fhi, open('newdata.txt', 'w') as fho:
# Iterate over the input file.
for store in fhi:
# Read in the rest of the pertinent data
fields = [next(fhi).rstrip() for _ in range(5)]
# Generate a list of all fields for this store.
row = [store.rstrip()] + fields
# Output to the new data file.
fho.write('%s\n' % ''.join(row))
# Consume a blank line in the input file.
next(fhi)
答案 3 :(得分:0)
第一个心灵敏感的解决方案
import re
ch = ('StoreName1\r\n'
', Address\r\n'
', City\r\n'
',State\r\n'
',Zip\r\n'
', Phone\r\n'
'\r\n'
'StoreName2\r\n'
', Address\r\n'
', City\r\n'
',State\r\n'
',Zip\r\n'
', Phone')
regx = re.compile('(?:(?<=\r\n\r\n)|(?<=\A)|(?<=\A\r\n))'
'(.+?)\r\n(,.+?)\r\n(,.+?)\r\n(,.+?)\r\n(,.+?)\r\n(,[^\r\n]+)')
with open('csvoutput.txt','wb') as f:
f.writelines(''.join(mat.groups())+'\r\n' for mat in regx.finditer(ch))
模仿Windows平台上文件的内容(换行符== \ r \ n)
第二个心灵的解决方案
regx = re.compile('(?:(?<=\r\n\r\n)|(?<=\A)|(?<=\A\r\n))'
'.+?\r\n,.+?\r\n,.+?\r\n,.+?\r\n,.+?\r\n,[^\r\n]+')
with open('csvoutput.txt','wb') as f:
f.writelines(mat.group().replace('\r\n','')+'\r\n' for mat in regx.finditer(ch))
如果您想创建一个包含逗号以外的其他分隔符的CSV文件,那么第三个令人难以置信的解决方案:
regx = re.compile('(?:(?<=\r\n\r\n)|(?<=\A)|(?<=\A\r\n))'
'(.+?)\r\n,(.+?)\r\n,(.+?)\r\n,(.+?)\r\n,(.+?)\r\n,([^\r\n]+)')
import csv
with open('csvtry3.txt','wb') as f:
csvw = csv.writer(f,delimiter='#')
for mat in regx.finditer(ch):
csvw.writerow(mat.groups())
你说得对,tchrist,以下解决方案要简单得多:
regx = re.compile('(?<!\r\n)\r\n')
with open('csvtry.txt','wb') as f:
f.write(regx.sub('',ch))
不需要正则表达式:
with open('csvtry.txt','wb') as f:
f.writelines(x.replace('\r\n','')+'\r\n' for x in ch.split('\r\n\r\n'))
处理文件,不再是 ch :
'àlagnibbler“解决方案,如果文件无法在内存中同时读取,因为它太大了:
from itertools import groupby
with open('csvinput.txt','r') as f,open('csvoutput.txt','w') as g:
groups = groupby(f,key= lambda v: not str.isspace(v))
g.writelines(''.join(x).replace('\n','')+'\n' for k,x in groups if k)
我有另一个正则表达式的解决方案:
import re
regx = re.compile('^((?:.+?\n)+?)(?=\n|\Z)',re.MULTILINE)
with open('input.txt','r') as f,open('csvoutput.txt','w') as g:
g.writelines(mat.group().replace('\n','')+'\n' for mat in regx.finditer(f.read()))
我发现它类似于类似gnibbler的解决方案
答案 4 :(得分:-1)
f = open(infilepath, 'r')
s = ''.join([line for line in f])
s = s.replace('\n\n', '\\n')
s = s.replace('\n', '')
s = s.replace("\\n", "\n")
f.close()
f = open(infilepath, 'r')
f.write(s)
f.close()
应该这样做。它将用新格式替换您的输入文件