Python, проблемы с изменением текстового файла, поиском терминов - PullRequest
1 голос
/ 05 августа 2011

Я вчера разместил вопрос здесь: Поиск и добавление в файл .kml с использованием python

Я прочитал несколько учебников и теперь лучше понимаю, как работает Python, и этохорошо.Тем не менее, я все еще не могу понять мой сценарий правильно.Я знаю, что я очень близко.По сути, я хочу добавить несколько файлов JPG в файл .kml, который в основном представляет собой XML в Google Планета Земля.Я хочу, чтобы моя программа нашла "метку места" Google Earth в xml-файле с именем: TO-XXX

, где XXX соответствует TO-XXX.jpg.У меня уже есть папка с кучей .jpgs, имя файла которой совпадает с именем каждого метки.Мне нужна программа, чтобы найти

<name> (for example <name>TO-101</name>) 

и добавить строку прямо под строкой с именем:

<description> <img src=TO-101.jpg></description>. 

Итак, у меня написан код, но я просто могу 'Кажется, чтобы найти его.Который всегда пишется:

"\t\t\t<name>TO-XXX</name>\n".

Итак, вот код:

import os

infile = 'TO-Hand-Holes2.kml' # the file I am reading
outfile = 'TO-Hand-Holes-Output.kml' # the file I plan to write to, using print for now
images = os.listdir("./images") # the images folder, all image names match names

source = open(infile, 'r')
target = open(outfile, 'w')

x = 0 #an incrementer
i = 0 # an incrementer

readxml = source.readline
while x < 20000:   #There are about 17,000 lines in the .kml file
    readxml = source.readline()
    while i < len(images):
        word = images[i]
        if readxml == "\t\t\t<name>%s</name>\n" % word[:6]: #!!!!!!!!! the problem is here
            print readxml #output the <name>
            print word[:6] #output the <description>
            hit = 'true'
            i = i + 1
        else:
            hit = 'false'
            #print "test%s" % word[:6]
            i = i + 1
    if hit == 'false':
        print ("%s") % readxml
    x = x + 1

Я просто не могу заставить его распознавать строки.Есть предложения?

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Я внес некоторые изменения, но у меня нет файлов для тестирования. Я внес некоторые изменения, связанные с Python, для ваших учебных целей. Я думаю, вам следует проверить, находится ли нужная вам информация в строке, а не проверять эквивалентность. Если вы хотите проверить эквивалентность, вы должны использовать line.strip (), потому что он будет содержать вкладки, переводы строк и т. Д., Которые вы, возможно, не учитываете (и не хотите явно учитывать, tbh).

import os

infile = 'TO-Hand-Holes2.kml' # the file I am reading
outfile = 'TO-Hand-Holes-Output.kml' # the file I plan to write to, using print for now
images = os.listdir("./images") # the images folder, all image names match names

source = open(infile, 'r')
target = open(outfile, 'w')

for line in source.readlines():   #read all of the source lines into a list and iterate over them
    for image in images:  #you can iterate over a list like this
        word = image[:6] #i moved the list slicing here so you only have to do it once
        if "<name>" in line and word in line: #!!!!!!!!! the problem is here
            print line #output the <name>
            print word #output the <description>
            hit = True  #use the built-in Python boolean type
        else:
            hit = False
            #print "test%s" % word[:6]
        target.write(line)
        if hit:
            target.write("<description> <img src={0}></description>\n".format(image)

source.close()
target.close()
1 голос
/ 05 августа 2011

Это было бы лучше:

import os

infile = 'TO-Hand-Holes2.kml' # the file I am reading
outfile = 'TO-Hand-Holes-Output.kml' # the file I plan to write to, using print for now
images = os.listdir("./images") # the images folder, all image names match names


with open(infile, 'r') as source:
    with open(outfile, 'w') as target:
        for readxml in source:
            for word in images:
                hit = readxml == "\t\t\t<name>%s</name>\n" % word[:6]
                if hit: #!!!!!!!!! the problem is here
                    print readxml #output the <name>
                    print >> target, word[:6] #output the <description>
1 голос
/ 05 августа 2011

Поскольку отступы - это синтаксис в Python, вы действительно должны быть осторожны с тем, где что находится. Это может подойти ближе. Он не завершен на 100%, но он укажет вам правильное направление:

with open(infile) as fhi, open(outfile, 'w') as fho:
  for line in fhi:
    if line == 'myMatchString':
      fho.write(line.replace('this', 'that'))

Использует синтаксис нескольких файлов для оператора with, который был представлен в 2.7. До версии 2.7 вам понадобится вложить второй with, чтобы получить второй файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...