2016-04-05 4 views
0

Я читаю из файла, который имеет в нем следующее.Строка разделения с несколькими разделителями

87965164,Paris,Yu,6/27/1997 
87965219,Heath,Moss,10/13/1996 
87965187,Cale,Blankenship,10/22/1995 
87965220,Terrence,Watkins,12/7/1996 
87965172,Ansley,Padilla,3/30/1997 

мне нужно разбить строки на «» и „/“, а также удаление в „\ п“ с конца.

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

[['87965164', 'Paris', 'Yu', 6, 27, 1997], ['87965219', 'Heath', 'Moss', 10, 13, 1996], ['87965187', 'Cale', 'Blankenship', 10, 22, 1995], ['87965220', 'Terrence', 'Watkins', 12, 7, 1996], ['87965172', 'Ansley', 'Padilla', 3, 30, 1997]] 
+3

Вы попробовали что-нибудь вообще? – usr2564301

ответ

2

You're going to want regular expressions.

import re 

results = [] 
for line in fl: 
    # [,/] means "match if either a , or a/is present" 
    results.append(re.split('[,/]',line.strip())) 

Если у вас есть особенно большой файл, вы можете обернуть его в генераторе:

import re 
def splitter(fl): 
    for line in fl: 
    # By using a generator, you are only accessing one line of the file at a time. 
    yield re.split('[,/]',line.strip()) 
0

Для каждой строки:

parts = line.split(',') 
parts[-1:] = map(int, parts[-1].split('/')) 

Это будет корректно обрабатывать ввод с любыми косыми чертами в непереданных частях и легко обрабатывать преобразование в целые числа одновременно.

1

Simpler, чем регулярное выражение:

[line.replace('/', ',').split(',') for line in text.split('\n')] 

Вы можете преобразовать числа в int с потом.

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

from datetime import datetime 
from collections import namedtuple 

Person = namedtuple('Row', ['idn', 'first', 'last', 'birth']) 

def make_person(idn, first, last, birth): 
    return Person(idn, first, last, 
        datetime.strptime(birth, "%m/%d/%Y")) 

records = [make_person(*line.split(',')) for line in text.split('\n')] 
1

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

С словарями:

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     month, day, year = map(int, day.split('/')) 
     results[id] = {'id':id, 'first':first, 'last':last, 
         'month':month, 'day':day, 'year':year} 

С классом:

class Person: 
    def __init__(self, id, first, last, day): 
     self.id = id 
     self.first = first 
     self.last = last 
     self.month, self.day, self.year = map(int, day.split('/')) 

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     results[id] = Person(id, first, last, day) 

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

+0

Я считаю, что это именно то, что было создано 'namedtuple' для – Elazar

+0

@Elazar -' namedtuple' добавляет обозначение объекта 'tuple', но' tuple' по-прежнему является однородным типом данных (а также неизменным, в отличие от 'list 'ы). – TigerhawkT3

+0

Я не согласен. Нотация - важная часть. Неизменность - еще одна особенность. И тот факт, что вы можете перебирать поля, упрощает печать в разных форматах. – Elazar