Петли не работают - строки (Python) - PullRequest
0 голосов
/ 17 июня 2011

Мне нужна помощь в чтении этих текстовых файлов, так или иначе, когда я делаю рекурсивный цикл, другой цикл всегда сбрасывается на 1-ю строку.

import sys
import codecs # there are actually more utf-8 char to the lines, so i needed codecs
reload(sys)
sys.setdefaultencoding('utf-8')

reader = codecs.open("txtfile1", 'r', 'utf-8')
reader2 = codecs.open("txtfile2", 'r', 'utf-8')

for row in reader:
    print row[0:11] # here the outer loops is running the cycles
    for row2 in reader2:
        print row[0:11] # here the outer loops gets resets
        if row[0:11]==row2[0:11]:
            print row[12:] + row2[12:]

Текстовые файлы выглядят так:

txtfile1

95032302317 foo
95032302318 bar
95032302319 bron
95032302320 cow
95032302321 how 
95032302322 now
95032303001 lala
95032303002 lili

txtfile2

95032103318 bar (in another utf8 language)
95032103319 bron (in another utf8 language)
95032103320 cow (in another utf8 language)
95032103321 how (in another utf8 language)
95032103322 now (in another utf8 language)
95032103323 didi
95032103324 dada
95032103325 kaka

Ответы [ 3 ]

1 голос
/ 17 июня 2011

Я бы просто сделал это так:

row2 = reader2.readlines()
for row in reader.readlines():
    print row
    if row in row2:
        print 'yeah'

РЕДАКТИРОВАТЬ: новое решение:

row2 = [line[:11] for line in reader2.readlines()]
for row in reader.readlines():
    print row
    if row[:11] in row2:
        print 'yeah'
1 голос
/ 17 июня 2011

Этот код записывает файлы в память, но, вероятно, будет работать для вас, если ваши файлы меньше нескольких сотен мегабайт.

#!/usr/bin/python2 -S
# -*- coding: utf-8 -*-
# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab

import sys
sys.setdefaultencoding("utf-8")
import site

import codecs

t1 = {}
t2 = {}

with codecs.open("txtfile1", 'r', 'utf-8') as reader:
    for row in reader:
        number, text = row.split(" ", 1)
        t1[number] = text

with codecs.open("txtfile2", 'r', 'utf-8') as reader:
    for row in reader:
        number, text = row.split(" ", 1)
        t2[number] = text

common = set(t1.keys()) & set(t2.keys())

while common:
    key = common.pop()
    print t1[key], t2[key]
1 голос
/ 17 июня 2011

Не могу сказать, почему, но это можно исправить, просто заменив for row in reader: на for row in reader.readlines():. Если все не может быть импортировано за один раз, вам, вероятно, придется обрабатывать итерации вручную.

EDIT

Я только что понял, что сделал что-то немного другое, чтобы заставить это работать:

outer = codecs.open(<outer loop file).readlines()
inner = codecs.open(<inner loop file).readlines()

for o in outer:
   for i in inner:
       print o
...