Извлечение предметов разных макетов из списков - PullRequest
0 голосов
/ 17 января 2019

У меня странно ведет себя файл из программы Linux; Примеры первых строк:

 1 1011.720000 1830.340000            0            0            0           191340          ?   1.000000
 2 1011.720000 1830.340000            0            0            0           725670          ?   2.000000
 3 1011.720000 1830.340000            0            0            0       1.4378e+06          ?   3.000000
 4 1011.720000 1830.340000            0            0            0        2.178e+06          ?   4.000000
 5 1011.720000 1830.340000            0            0            0       2.8806e+06          ?   5.000000
 6 1011.720000 1830.340000            0            0            0       3.5353e+06          ?   6.000000
 7 1011.720000 1830.340000            0            0            0       4.1598e+06          ?   7.000000
 8 1011.720000 1830.340000            0            0            0       4.7729e+06          ?   8.000000
 9 1011.720000 1830.340000            0            0            0       5.3924e+06          ?   9.000000
10 1011.720000 1830.340000            0            0            0       6.0281e+06          ?  10.000000

Мне нужно извлечь только два значения из каждой строки:

191340
725670
1.4378e+06
2.178e+06
.... etc

1.00000
2.00000
3.00000
4.00000
.... etc

Этот код:

import csv
with open('NGC1365GaiaPhotomLogTestTenLines.dat', "rb") as infile:
read = csv.reader(infile)
    for row in read :
        print (row)

Формирует:

['         1 1011.720000 1830.340000            0            0            0           191340          ?   1.000000']
['         2 1011.720000 1830.340000            0            0            0           725670          ?   2.000000']
['         3 1011.720000 1830.340000            0            0            0       1.4378e+06          ?   3.000000']
['         4 1011.720000 1830.340000            0            0            0        2.178e+06          ?   4.000000']
['         5 1011.720000 1830.340000            0            0            0       2.8806e+06          ?   5.000000']
['         6 1011.720000 1830.340000            0            0            0       3.5353e+06          ?   6.000000']
['         7 1011.720000 1830.340000            0            0            0       4.1598e+06          ?   7.000000']
['         8 1011.720000 1830.340000            0            0            0       4.7729e+06          ?   8.000000']
['         9 1011.720000 1830.340000            0            0            0       5.3924e+06          ?   9.000000']
['        10 1011.720000 1830.340000            0            0            0       6.0281e+06          ?  10.000000']

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

Я, хотя и не собирался быть трудным, но я справился с множеством нитей и ни к чему не привел.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вот код, который вы можете использовать

Также пара замечаний по поводу вашего кода csv.reader - это перебор. Все делается с помощью просто встроенных модулей - это не внешние зависимости.

Также использование имен переменных, таких как read, не очень хорошая идея.

lines = """1 1011.720000 1830.340000            0            0            0           191340          ?   1.000000
 2 1011.720000 1830.340000            0            0            0           725670          ?   2.000000
 3 1011.720000 1830.340000            0            0            0       1.4378e+06          ?   3.000000
 4 1011.720000 1830.340000            0            0            0        2.178e+06          ?   4.000000
 5 1011.720000 1830.340000            0            0            0       2.8806e+06          ?   5.000000
 6 1011.720000 1830.340000            0            0            0       3.5353e+06          ?   6.000000
 7 1011.720000 1830.340000            0            0            0       4.1598e+06          ?   7.000000
 8 1011.720000 1830.340000            0            0            0       4.7729e+06          ?   8.000000
 9 1011.720000 1830.340000            0            0            0       5.3924e+06          ?   9.000000
10 1011.720000 1830.340000            0            0            0       6.0281e+06          ?  10.000000"""

for line in lines.split("\n"):
    toks = line.split() # This should split the line into tokens separated by one or more white space characters. 

    if len(toks) == 9: # Just to make sure there are enough tokens. 
        # do whatever you want
        print (toks[6])
0 голосов
/ 17 января 2019

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

with open('filename') as infile:
    r = csv.reader(infile, delimiter=' ', skipinitialspace=True)
    for row in r:
        print(row)

Ваш файл выглядит так, как будто на вашем компьютере он разделен табуляцией. В этом случае вы бы изменили delimiter=' ' на delimiter='\t' в приведенном выше.

Вы также можете использовать , который имеет более общий режим пробелов

df = pd.read_csv("filename", header=None, delim_whitespace=True)
0 голосов
/ 17 января 2019

Кредит @Eugen Constantin Dinca & @tobias_k за упрощение кода

with open('csv.dat', "rb") as infile:
  for row in infile:
    print row.split()

Выход:

['1', '1011.720000', '1830.340000', '0', '0', '0', '191340', '?', '1.000000']
['2', '1011.720000', '1830.340000', '0', '0', '0', '725670', '?', '2.000000']
['3', '1011.720000', '1830.340000', '0', '0', '0', '1.4378e+06', '?', '3.000000']
['4', '1011.720000', '1830.340000', '0', '0', '0', '2.178e+06', '?', '4.000000']
['5', '1011.720000', '1830.340000', '0', '0', '0', '2.8806e+06', '?', '5.000000']
['6', '1011.720000', '1830.340000', '0', '0', '0', '3.5353e+06', '?', '6.000000']
['7', '1011.720000', '1830.340000', '0', '0', '0', '4.1598e+06', '?', '7.000000']
['8', '1011.720000', '1830.340000', '0', '0', '0', '4.7729e+06', '?', '8.000000']
['9', '1011.720000', '1830.340000', '0', '0', '0', '5.3924e+06', '?', '9.000000']
['10', '1011.720000', '1830.340000', '0', '0', '0', '6.0281e+06', '?', '10.000000']
...