Как прочитать в строке все символы из столбца A в B
-
19-09-2019 - |
Вопрос
возможно ли это в Python, учитывая файл с 10000 строками, где все они имеют такую структуру:
1, 2, xvfrt ert5a fsfs4 df f fdfd56, 234
или аналогично, прочитать всю строку целиком, а затем сохранить в другой строке все символы из столбца 7 в столбец 17, включая пробелы, чтобы новая строка была
"xvfrt ert5a" ?
Большое спасибо
Решение
Технически это отвечает на прямой вопрос:
lst = [line[6:17] for line in open(fname)]
но здесь есть фатальный изъян.Это нормально для одноразового кода, но эти данные подозрительно похожи на значения, разделенные запятыми, а третье поле может даже представлять собой фрагменты данных, разделенные пробелом.Гораздо лучше сделать это так, чтобы, если в первых двух столбцах появится дополнительная цифра, это все равно сработало:
lst = [x[2].strip()[0:11] for x in [line.split(',') for line in open(fname)]]
И если эти фрагменты, разделенные пробелами, могут стать длиннее, то это:
lst = [x[2].strip().split()[0:2] for x in [line.split(',') for line in open(fname)]]
Не забудьте пару комментариев, чтобы объяснить, что происходит.Возможно:
# on each line, get the 3rd comma-delimited field and break out the
# first two space-separated chunks of the licence key
Предполагая, конечно, что это лицензионные ключи.Не нужно быть слишком абстрактным в комментариях.
Другие советы
lst = [line[6:17] for line in open(fname)]
another_list = []
for line in f:
another_list.append(line[6:17])
Или в качестве генератора (решение, ориентированное на память):
another_list = (line[6:17] for line in f)
Я собираюсь немного подробнее остановиться на ответе Майкла Диллона.Если под "столбцами с 6 по 17" вы подразумеваете "первые 11 символов третьего поля, разделенного запятыми", это хорошая возможность использовать csv
модуль.Кроме того, для Python 2.6 и выше считается наилучшей практикой использовать инструкцию 'with' при открытии файлов.Узрите:
import csv
with open(filepath, 'rt') as f:
lst = [row[2][:11] for row in csv.reader(f)]
Это сохранит начальный пробел;если вы этого не хотите, измените последнюю строку на
lst = [row[2].lstrip()[:11] for row in csv.reader(f)]
Вы не говорите, как вы хотите сохранить данные из каждой из 10 000 строк - если вы хотите, чтобы они были в списке, вы бы сделали что-то вроде этого:
my_list = []
for line in open(filename):
my_list.append(line[7:18])
for l in open("myfile.txt"):
c7_17 = l[6:17]
# Not sure what you want to do with c7_17 here, but go for it!
Эта functionw вычислит нужную вам строку и распечатает ее
def readCols(filepath):
f = open(filepath, 'r')
for line in file:
newString = line[6:17]
print newString