[python] najdi, nahrad, uloz v ascii subore
Leos Pol
leos na radiante-corp.com
Středa Srpen 23 16:42:20 CEST 2006
Ano, soubor se precte cely a pri opravdu velkych souborech to muze
skoncit na pameti. Napada me pouze jeden zpusob, jak toto vyresit.
Prochazet vstupni soubor po radcich, vzdy nacist cely block (NAME,
CODE), pripadne pozmenit a vzdy to pridat do noveho souboru. Nakonec
novy soubor prejmenovat na puvodni.
Leo
peter wrote:
> Diky moc,
>
> pokial som dobre pochopil z manualu tak
>
> content = fd.read()
>
> nacita cely obsah suboru do cache alebo bufferu, a to je prave to co ja
> nechcem, pretoze pracujem s velkymi subormi. Chcem sa vyhnut tomu ze
> nacitam vsetko do pamate, nahradim co potrebujem a potom to zase vsetko
> ulozim. Ale neviem ci je to vobec mozne, nie som az taky velky
> specialista v pythone. V mojom kode idem po jednotlivych riadkoch
> suboru....
>
>
> Leos Pol wrote:
>
>> Ahoj,
>> omlouvam se, ale nedokazal jsem tvuj kod opravit, tak posilam alespon
>> svoje reseni:
>>
>> import re
>> fd = open('data.txt', 'r+')
>> content = fd.read()
>> delimiter = re.search('\$-+', content).group()
>> blocks = re.split('\$-+', content)
>> for idx in range(len(blocks)):
>> if 'NAME=\'ALFA\'' in blocks[idx]:
>> code = re.search('CODE=\'(.*)\'', blocks[idx]).groups()
>> blocks[idx] = blocks[idx].replace('NAME=\'ALFA\'',
>> 'NAME=\'BETA%s\'' % code)
>> fd.seek(0)
>> fd.write(delimiter.join(blocks))
>> fd.close()
>>
>> Doufam, ze to pomuze,
>> Leo
>> PS: nejspise ale asi hledas "seek" a "tell".
>>
>> peter wrote:
>>
>>> Zdravim,
>>>
>>> potreboval by som poradit.
>>>
>>> Priklad (jeden blok v subore):
>>> $------------------------
>>> NAME='ALFA'
>>> CODE='x'
>>> $------------------------
>>>
>>> Takychto blokov je v subore vela s roznymi menami a kodmi. Potrebujem
>>> naprogramovat skript ktory prehlada cely subor a najde vyrazy s menami
>>> ALFA a podla toho co za kazdou ALFOU bude nasledovat (napr. x,y,z)
>>> zmeni meno ALFA na BETAx,BETAy, BETAz a zemeneny subor ulozi.
>>>
>>> Dostal som sa k tomu ze najdem vsetky vyrazy ktore potrebujem, podla
>>> kodu zmenim meno na BETAx,y alebo z ale uz neviem ako zapisat nove
>>> nazvy na rovnake miesto ako bola dana ALFA. Vzdy mi to zapise na koniec
>>> suboru. Tu je moj kod.
>>> Dakujem vopred za akukolvek pomoc.
>>>
>>> Moj kod:
>>>
>>> import shutil
>>>
>>> NamFile="test2.nam"
>>> BackupNamFile = 1
>>> if BackupNamFile == 1:
>>> shutil.copyfile(NamFile,NamFile.replace(".nam",".nam.bak"))
>>> LineNum=1
>>> LineNumQuantity=0
>>> ArrayCount=0
>>> LineNumArray=[]
>>> ReqArray=[]
>>> ReqName=""
>>> NamFileOpen=file(NamFile,"r+")
>>> for line in NamFileOpen:
>>> LineTextFound1 = line.find("bk")
>>> LineTextFound2 = line.find("_results")
>>> if LineTextFound1 != -1 and LineTextFound2 != -1:
>>> ReqName=line.split("'")[1]
>>> print "Line: \t\t\t"+ str(LineNum)
>>> print "Request Name: \t\t"+ ReqName
>>> LineNumQuantity = LineNum + 2
>>> ReqArray=[LineNum-2,ReqName]
>>> if LineNum == LineNumQuantity:
>>> QuantityName=line.split("'")[1]
>>> print "Quantity Type: \t\t"+QuantityName
>>> if QuantityName == "dx":
>>> Suffix = "_disp"
>>> elif QuantityName == "vx":
>>> Suffix = "_velo"
>>> elif QuantityName == "fx":
>>> Suffix = "_force"
>>> else:
>>> Suffix = "_results"
>>> print "Suffix: \t\t"+Suffix
>>> NewReqName=ReqName.replace("_results",Suffix,1)
>>> ReqArray.append(NewReqName)
>>> LineNumArray.insert(ArrayCount,ReqArray)
>>> ArrayCount+=1
>>> print "New Request Name: \t"+NewReqName
>>> print "-----------------------"
>>> LineNum = LineNum+1
>>> print LineNumArray
>>> print len(LineNumArray)
>>> NamFileOpen.close()
>>>
>>> NamFileOpen2=file(NamFile,"r+")
>>> LineNum=1
>>> for i in LineNumArray:
>>> print i
>>> for line in NamFileOpen2:
>>> print line
>>> print LineNum
>>> print i[1]
>>> if i[0]== LineNum:
>>> print i[0]
>>> print LineNum
>>> print line
>>> Temp=line.replace(line.split("'")[1],i[2],1)
>>> print Temp
>>> NamFileOpen2.write(Temp)
>>> LineNum=LineNum+1
>>> NamFileOpen2.close()
>>>
>>> _______________________________________________
>>> Python mailing list
>>> Python na py.cz
>>> http://www.py.cz/mailman/listinfo/python
>>>
>>>
>> --
>> ----
>> Leos Pol
>> SW Engineer
>> Radiante Corp.
>>
>> If it can be imagined,
>> we can implement it
>>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
--
----
Leos Pol
SW Engineer
Radiante Corp.
If it can be imagined,
we can implement it
Další informace o konferenci Python