Форум сайта python.su
0
Объясните простым русским в чем разница в двух подходах к чтению файла.
Первый:
f = [] d = [] with open(filepath, 'r') as file: for line in file: d.append(line.split('\t')) for r in d: if len(r)==33: f.append([r[0], r[2], r[6], r[12], r[19], r[10]]) del d
f = [[r[0], r[2], r[6], r[12], r[19], r[10]] for r in [x.split('\t') for x in open(filepath, 'r')] if len(r) == 33]
Отредактировано steelunicorn (Июнь 7, 2018 14:12:32)
Офлайн
1
1. Во втором варианте скорее всего автоматом файл не закроется. Проверить легко - добавить close и если будет ошибка, значит выборка сама закрыла файл.
2. В обоих случаях идет анализ файла как текстового с выборкой по строкам. Проблема возникнет только в случае очень длинной строки. Кажется ограничение строки 4GB, нужно посмотреть внимательнее описание. Но такое врят-ли случиться, хотя гарантию никто не даст )))
3. 2й вариант интереснее не просто компактностью, но и тем, что он, требует вдвое меньше памяти, т.к. практически не загружает промежуточный буфер (в 1м варианте предварительное чтение всего файла в массив d, а массивы вроде как более тяжелые, чем кортежи).
Офлайн
186
Первый “подход” не правильный, там список d не нужен совсем. Во втором подходе аналогичная ошибка, в место
[x.split('\t') for x in open(filepath, 'r')]
( x.split('\t') for x in open(filepath, 'r') )
Офлайн
0
RodegastКортежами заменил, возвращаю генератор, но столкнулся с проблемой. Изначально код был слегка сложнее, а именно
См. то что я написал выше + в место списков возвращай генератор, замени вложенные списки кортежами.
d = [[r[2], r[3], r[8], r[7], r[29], r[10]] for r in [x.split('\t') for x in open(filepath, 'r')] if len(r) == 40] or [[r[0], r[2], r[6], r[12], r[19], r[10]] for r in [x.split('\t') for x in open(filepath, 'r')] if len(r) == 33]
d = ((r[2], r[3], r[8], r[7], r[29], r[10]) for r in (x.split('\t') for x in open(filepath, 'r')) if len(r) == 40) or ([r[0], r[2], r[6], r[12], r[19], r[10]] for r in (x.split('\t') for x in open(filepath, 'r')) if len(r) == 33)
Офлайн
186
Попробуй так:
d = ( (r[2], r[3], r[8], r[7], r[29], r[10]) if len(r) == 40 else ([r[0], r[2], r[6], r[12], r[19], r[10]) for r in ( x.split('\t') for x in open(filepath, 'r') ) if len(r) == 40 or len(r) == 33 )
Офлайн
0
RodegastРаботает, супер!
Попробуй так:
Офлайн