Использование python для обработки фрагмента файла каждые x строк - PullRequest
2 голосов
/ 19 июля 2011

Что я пытаюсь сделать, это прочитать z строк через каждые интервалы строк y из файла DATA.txt , а затем выполнить функцию найди на этом патроне строк.Т.е. я хочу пропустить первые y строк;читать в следующих z строках;выполнить функцию find в тех строках, которые только что прочитаны;пропустить следующие y строки;и повторите для длины файла (передается в sys.argv [1] ).

То, что у меня здесь есть, дает мне множество пустых строк для переменной lines , и я не уверен почему.Если нужно, я могу предоставить функцию find , но я думаю, что так проще.

Если кто-то захочет предложить совершенно другой способ, я буду так же рад, как исправитьсуществующий код, пока я понимаю, что происходит.

РЕДАКТИРОВАТЬ: я пропустил несколько парен, но добавление их не решило проблему.

import sys
import operator
import linecache
def find(arg)
    ...
x=0
while x<int(sys.argv[1]):
   x+=1 
   if mod(x, y)==0:
       for i in range(x,x+z):
           block=linecache.getline('DATA.txt', i)
           g = open('tmp','a+')
           g.write(block)
           linecache.clearcache()
           lines=g.read()
           find(lines)
           g.close()
   else:
       pass
g.close()
f.close()

Ответы [ 4 ]

2 голосов
/ 19 июля 2011

edit : попробуйте следующее, я думаю, у меня есть лучшее представление о том, что вы пытаетесь сделать сейчас.

g = open('tmp','a+')
while x<int(sys.argv[1]):
   x+=1 
   if mod(x, y)==0:
       curr = g.tell()
       for i in range(x,x+z):
           block=linecache.getline('DATA.txt', i)
           g.write(block)
           linecache.clearcache()
       g.seek(curr)
       lines = g.read()
       find(lines)
   else:
       pass
g.close()
1 голос
/ 20 июля 2011

Маймон, ваш исходный код неверен в отношении индексов. И код Эндрю тоже неверен, потому что он принял ваш код за начало.

См. Результат кода Эндрю, в котором я исключил строки, касающиеся g :

import sys
import operator
import linecache

x=0
y=7  # to skip
z=3  # to print

#g = open('tmp','a+')
while x<23:
    x+=1
    print 'x==',x
    if operator.mod(x, y)==0:
        #curr = g.tell()
        for i in range(x,x+z):
            block=linecache.getline('poem.txt', i)
            print 'block==',repr(block)
            #g.write(block)
            linecache.clearcache()
            #g.seek(curr)
            #lines = g.read()
            #find(lines)

    else:
        pass

#g.close()

применяется к файлу с именем 'poem.txt', содержащему 24 строки:

1 In such a night, when every louder wind
2 Is to its distant cavern safe confined;
3 And only gentle Zephyr fans his wings,
4 And lonely Philomel, still waking, sings;
5 Or from some tree, famed for the owl's delight,
6 She, hollowing clear, directs the wand'rer right:
7 In such a night, when passing clouds give place,
8 Or thinly veil the heav'ns' mysterious face;
9 When in some river, overhung with green,
10 The waving moon and trembling leaves are seen;
11 When freshened grass now bears itself upright,
12 And makes cool banks to pleasing rest invite,
13 Whence springs the woodbind, and the bramble-rose,
14 And where the sleepy cowslip sheltered grows;
15 Whilst now a paler hue the foxglove takes,
16 Yet checkers still with red the dusky brakes
17 When scattered glow-worms, but in twilight fine,
18 Shew trivial beauties watch their hour to shine;
19 Whilst Salisb'ry stands the test of every light,
20 In perfect charms, and perfect virtue bright:
21 When odors, which declined repelling day,
22 Through temp'rate air uninterrupted stray;
23 When darkened groves their softest shadows wear,
24 And falling waters we distinctly hear;

Результат:

x== 1
x== 2
x== 3
x== 4
x== 5
x== 6
x== 7
block== '7 In such a night, when passing clouds give place,\n'
block== "8 Or thinly veil the heav'ns' mysterious face;\n"
block== '9 When in some river, overhung with green,\n'
x== 8
x== 9
x== 10
x== 11
x== 12
x== 13
x== 14
block== '14 And where the sleepy cowslip sheltered grows;\n'
block== '15 Whilst now a paler hue the foxglove takes,\n'
block== '16 Yet checkers still with red the dusky brakes\n'
x== 15
x== 16
x== 17
x== 18
x== 19
x== 20
x== 21
block== '21 When odors, which declined repelling day,\n'
block== "22 Through temp'rate air uninterrupted stray;\n"
block== '23 When darkened groves their softest shadows wear,\n'
x== 22
x== 23
x== 24
x== 25

Я выбрал y = 7 для количества пропускаемых строк, но строка 7 печатается.

Кроме того, отсчет продолжается с 8, 9, 10 ... после того, как вы напечатали 3 строки 7-8-9 (выбрав z = 3) вместо продолжения с 10, 11, 12 ... Затем следующий 3 строки напечатаны 14-15-16, в то время как это должны быть строки после 7 + 3 первых строк, то есть строки 11-12-13

На самом деле, если вы хотите пропустить 7 строк, а затем напечатать 3 строки, напечатанные строки должны быть:
8-9-10
18-19-20
28-29-30
и т.д.

Я прав?

РЕДАКТИРОВАТЬ 1

Мое решение:

def chunk_reading(filepath,y,z,x=0):
    # x : number of lines to skip before the periodical treatment
    # y : number of lines to periodically skip
    # z : number of lines to periodically print
    with open('poem.txt') as f:
        try:
            for sk in xrange(x):
                f.next()
            while True:
                try:
                    for i in xrange(y):
                        print 'i==',i
                        f.next()
                    for j in xrange(z):
                        print 'j==',j
                        print repr(f.next())
                except StopIteration:
                    break
        except StopIteration:
            print 'Not enough lines before the lines to print'


chunk_reading('poem.txt',7,3)

производит:

i== 0
i== 1
i== 2
i== 3
i== 4
i== 5
i== 6
j== 0
"8 Or thinly veil the heav'ns' mysterious face;\n"
j== 1
'9 When in some river, overhung with green,\n'
j== 2
'10 The waving moon and trembling leaves are seen;\n'
i== 0
i== 1
i== 2
i== 3
i== 4
i== 5
i== 6
j== 0
'18 Shew trivial beauties watch their hour to shine;\n'
j== 1
"19 Whilst Salisb'ry stands the test of every light,\n"
j== 2
'20 In perfect charms, and perfect virtue bright:\n'
i== 0
i== 1
i== 2
i== 3
i== 4

РЕДАКТИРОВАТЬ 2

Приведенное выше решение применимо даже для очень больших файлов, которые невозможно записать в ОЗУ.

Следующий файл можно использовать для файлов ограниченного размера:

def slice_reading(filepath,y,z,x=0):
    # x : number of lines to skip before the periodical treatment
    # y : number of lines to periodically skip
    # z : number of lines to periodically print
    with open('poem.txt') as f:
        lines = f.readlines()
        lgth = len(lines)

    if lgth > x+y:
        for a in xrange(x+y,lgth,y+z):
            print lines[a:a+z]
    else:
        print 'Not enough lines before lines to print'


slice_reading('poem.txt',7,3,5)

результат

['13 Whence springs the woodbind, and the bramble-rose,\n', '14 And where the sleepy cowslip sheltered grows;\n', '15 Whilst now a paler hue the foxglove takes,\n']
['23 When darkened groves their softest shadows wear,\n', '24 And falling waters we distinctly hear;']
0 голосов
/ 19 июля 2011

В категории «Другой подход» я предлагаю следующее (номера строк, очевидно, предназначены только для отображения):

  1 """
  2 Reading line lines from DATA.txt, first skip 3 lines, then print 2 lines,
  3 then skip 3 more lines, etc.
  4 """
  5 
  6 def my_print(l):
  7     if (my_print.skip_counter > 0):
  8         my_print.skip_counter -= 1
  9     else:
 10         if (my_print.print_counter > 0):
 11             my_print.print_counter -= 1
 12             print l,
 13         else:
 14             my_print.skip_counter = my_print.skip_size
 15             my_print.print_counter = my_print.print_size
 16             my_print(l)
 17 
 18 my_print.skip_size = 3
 19 my_print.skip_counter = my_print.skip_size
 20 
 21 my_print.print_size = 2
 22 my_print.print_counter = my_print.print_size
 23 
 24 data = open('DATA.txt')
 25 for line in data:
 26     my_print(line)

Первый способ улучшить это - заключить в my_print () класс (с вашими x и y в качестве переменных-членов). Тогда вы можете получить все фантазии с генераторами, если вы хотите что-то действительно «питоническое».

0 голосов
/ 19 июля 2011

Я думаю, что вашей проблемой может быть строка lines=g.read. Следует читать lines=g.read()

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