"파일"이 적절한 길이로 분할되어 있고 이진 시퀀스가없는 경우 그렇지 않으면
import re
import fileinput
tagre = re.compile(r"<o:p>.*?</o:p>")
def sub(mo):
return mo.group().replace(r"'", r"\'")
for line in fileinput.input('thefilename', inplace=True):
print tagre.sub(sub, line),
, 당신은 "현재 위치에서 시뮬레이션해야합니다 :"텍스트로 읽는 것은 "휴식 것이, 당신은 fileinput
의 편리"하게 나는 곳에서 파일을 다시 작성하고있어 믿는다 "기능을 사용할 수 있습니다 재작 성 "자신, 예. (... 간략화 됨) :
with open('thefilename', 'rb') as inf:
with open('fixed', 'wb') as ouf:
while True:
b = inf.read(1024*1024)
if not b: break
ouf.write(tagre.sub(sub, b))
을 다음 'thefilename'
의 자리를 차지할 'fixed'
이동 (중, 또는 수동으로 코드에서) 당신은 파일 이름이 고정 후 남아있는 것을 필요로하는 경우.
중요한 <o:p> ... </o:p>
부품 중 하나가 두 개의 연속 메가 바이트 "블록"으로 나뉘어 결국 식별되지 않을 수 있기 때문에 과도하게 단순화됩니다 (첫 번째 예에서는 각 부품이 항상 " 라인 "- 그게 아니라면 그 코드를 사용해서는 안되지만, 다음은 어쨌든). 이 문제를 해결하려면, 아, 더 복잡한 코드가 필요합니다 ... :
with open('thefilename', 'rb') as inf:
with open('fixed', 'wb') as ouf:
while True:
b = getblock(inf)
if not b: break
ouf.write(tagre.sub(sub, b))
partsofastartag = '<', '<o', '<o:', '<o:p'
def getblock(inf):
b = ''
while True:
newb = inf.read(1024 * 1024)
if not newb: return b
b += newb
if any(b.endswith(p) for p in partsofastartag):
continue
if b.count('<o:p>') != b.count('</o:p>'):
continue
return b
당신이 보듯이 꽤 섬세한 코드이며, 따라서, 검증되지 않은 인 무엇, 나는 그것은 당신의 문제에 대한 올바른를 알 수 없다. 특히 의 케이스가 닫음 </o:p>
과 일치하지 않거나 그 반대의 경우가있을 수 있습니까? 그렇다면 getblock
에 대한 호출은 매우 비싼 방법으로 전체 파일을 반환 할 수 있으며 RE 일치 및 대체가 역효과를 일으킬 수도 있습니다 (후자는 이러한 태그의 작은 따옴표 중 일부가 이미 올바르게 이스케이프 된 경우에도 발생합니다 전부는 아니지만). 당신이 모든 훨씬 간단 코드 만들기, 메모리에 맞아야하기 때문에 정도, 블록 분할되는 민감한 문제를 피하고, 적어도, 가능하다 적어도 GB 경우
그러나
with open('thefilename', 'rb') as inf:
with open('fixed', 'wb') as ouf:
b = inf.read()
ouf.write(tagre.sub(sub, b))
을, 위에서 언급 한 다른 문제 (불균형 개폐 태그가있을 수 있음)가 남아있을 수 있습니다. 기존 결함 데이터를 연구하고 수정할 수있는 합리적으로 간단한 방법을 찾아 볼 수 있습니다!
파이썬에서는 꽤 쉽습니다. 1 시간 정도, 상판. 파이썬이 정말 재미 있기 때문에 직접 스크립트를 만드는 것이 좋습니다! :) –