Python: импортировать файл и конвертировать в список - PullRequest
3 голосов
/ 15 декабря 2009

Мне нужна помощь с импортом файла и преобразованием каждой строки в список.

Пример файла будет выглядеть так:

p wfgh 1111 11111 111111
287 48 0
65626 -1818 0
4654 21512 02020 0

Первая строка, начинающаяся с p, является заголовком, а остальные - предложениями. Каждая строка предложения должна начинаться с серии не менее двух целых чисел и заканчиваться нулем

спасибо заранее

Ответы [ 8 ]

8 голосов
/ 15 декабря 2009

Следующая строка создаст список, где каждый элемент является списком. Внутренний список - это одна строка, которая разбита на «слова».

li = [i.strip().split() for i in open("input.txt").readlines()]

Я поместил фрагмент кода, который вы разместили, в файл input.txt в c: \ temp и запустил эту строку. Вывод похож на то, что вы хотите?

C:\temp>python
Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print([i.strip().split() for i in open("input.txt").readlines()])
[['p', 'wfgh', '1111', '11111', '111111'], ['287', '48', '0'], ['65626', '-1818', '0'], ['4654', '21512', '02020', '0']]
2 голосов
/ 15 декабря 2009
p = open('filename')

#List:
linelist = [line for line in p.readlines()]

"""
But I prefer creating a dictionary as I find them more useful at times. Example here is very trivial. You can use the list index as a line number also.
"""

#Dictionary:
linedict = dict([(no, line) for no, line in enumerate(p.readlines())])
2 голосов
/ 15 декабря 2009
fileName=open("d:/foo.bar")
lines = [i for i in fileName.readlines()]

надеюсь, что поможет: D

1 голос
/ 24 февраля 2017
    with open('"input.txt"') as f:
    lines = f.read().splitlines()

это даст вам список значений (строк), которые вы имели в вашем файле, с зачеркнутыми строками.

1 голос
/ 16 декабря 2009

Чтобы построить список только тех строк в файле, которые содержат как минимум два целых числа и заканчиваются нулем, используйте регулярное выражение:

import re
p = re.compile(r'^((\-?\d*\s+){2,})0$')
with open(filename, 'rb') as f:
    seq = [line.strip() for line in f if p.match(line)]
0 голосов
/ 16 декабря 2009

Вы не предоставляете все детали, но я предполагаю, что:

  • в начале есть только 1 строка заголовка, и вам не нужно, что в ней
  • остальные строки содержат только целые числа
  • вам не нужно сохранять конечный '0'

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

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

result_list = read_data('foo.dat')

или вы можете сделать то же, что и я, в примере вызова и использовать каждую строку результата, когда она зачитывается. Вы можете вызвать этот файл напрямую, если вы используете Linux, в противном случае просто свяжите его с интерпретатором Python и назовите его с именем файла данных в качестве первого аргумента, и он будет выводить результаты построчно - это будет работать, даже если ваш файл огромен. Вы также можете просто импортировать файл как модуль и использовать метод read_data и использовать результаты в других вычислениях.

Обратите внимание, что он выполняет некоторую проверку ошибок (строка заголовка начинается с ap, а строки данных заканчиваются на 0 и содержат только целые числа), и вы, вероятно, захотите либо вообще не делать эту проверку, либо вызвать соответствующее исключение когда они встретятся.

#!/usr/bin/env python
import sys

def read_data(fn):
    """Reads in datafile

    data file is in format:
        p wfgh 1111 11111 111111
        287 48 0
        65626 -1818 0
        4654 21512 02020 0
    where first line begins with p and is a header, and following lines
    are comprised of at least 2 integers plus a tailing 0.
    Pass in the filename, the resulting list of lists of integers will be 
    returned.
    """
    f = open(fn, 'r')
    # check for header line
    assert(f.readline().split()[0]=='p')
    for l in f:
        d = [int(col) for col in l.split()]
        if not d:
            # skip empty lines
            continue
        # check we have at least 2 integers and the last column is 0
        assert(d[-1] == 0 and len(d) >= 3)
        # yield current line
        yield d[:-1]

if __name__ == '__main__':
    for l in read_data(sys.argv[1]):
        print unicode(l)
0 голосов
/ 15 декабря 2009
fh=open("file")
mylist=[]
header=fh.readline().rstrip()
if not header.startswith("p wncf") :
    print "error"
header=header.split()
mylist.append(header)
if len(header) != 5:
    print "error"
if False in map(str.isdigit, header[2:]):
    print "Error"
for line in fh:
    line=line.rstrip().split()
    if False in map(str.isdigit, line[0:2]):
        print "Error"            
    elif line[-1] != 0: 
        print "Error"
    else:
        mylist.append(line)
fh.close()
0 голосов
/ 15 декабря 2009

Если вы хотите, чтобы все значения находились в плоском списке, код будет выглядеть следующим образом:

ls=[]
for line in open( "input.txt", "r" ).readlines():
    for value in line.split( ' ' ):
        ls.append( value )

Если вам просто нужны строки в списке, вы можете остановиться на readlines ().

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