2013-05-30 3 views
0

Я новичок в python и пытаюсь разобраться в использовании функции лямбда. У меня есть два списка имен сетевых пользователей в текстовом файле, который мне нужно сопоставить. Код, который у меня до сих пор работает нормально (он соответствует именам, но чувствителен к регистру), но текст в обоих этих файлах - это беспорядок в верхнем и нижнем регистре. У меня может быть кузнец, Джон (FINANCE) в одном списке и SMITH, John (Finance) в другом. Там будут сотни текстовых файлов пользователя. Что мне нужно сделать, это нормализовать оба списка (например, в верхнем регистре), поэтому совпадения происходят независимо от случая. Моя нехватка знаний о питоне мешает мне. У меня есть следующиеPython Lambda Map

with open (filename, "r") as file1: 
    #file1m=map(lambda x: x.upper(),file1) 
    for line in islice(file1,20,None) 
     with open ("c:\\userlists\test.txt", "r") as file2: 

Но, если честно, я не знаю, где функция лямбда сидит в этом кусочке кода. Я пробовал это, когда вы видите хэш, но python никогда не делает совпадение имени пользователя. Я знаю, что мне нужно сделать файл верхнего регистра file2, но для этого теста и для упрощения процесса для меня я добавил несколько имен в верхнем регистре в test.txt, чтобы узнать, работает ли он. Без лямбда-функции, как уже упоминалось, мой код делает то, что мне нужно, и сопоставляет имя пользователя, но чувствителен к регистру. Любая помощь могла бы быть полезна.

Большое спасибо

+0

раскомментируйте вашей второй линии, а затем использовать file1m вместо file1 после – njzk2

+0

Спасибо. Я пробовал это и используя file1m (поэтому чтение в верхнем регистре file1), похоже, не подходит для python. IDLE просто сидит там, и я должен вырваться с клавиатуры. – user2377057

ответ

1

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

from itertools import imap 

class OpenUpperCase(object): 
    def __init__(self, *args, **kwargs): 
     self.file = open(*args, **kwargs) 
    def __enter__(self): 
     return imap(lambda s: s.upper(), self.file) 
    def __exit__(self, type, value, tb): 
     self.file.close() 
     return False # allow any exceptions to be processed normally 

if __name__ == '__main__': 
    from itertools import islice 

    filename1 = 'file1.txt' 
    with OpenUpperCase(filename1, "r") as file1: 
     for line in islice(file1, 20, None): 
      print line, # will be uppercased 
+0

Спасибо @martineau. Это действительно имеет смысл и является отличным ответом. Я вижу, что оба моих листа печатаются в верхнем регистре. Теперь я надеюсь, что я не хочу, чтобы луна была на палке, но я не могу найти матч. Я использую для i в файле1, для j в файле2, чтобы надеяться получить i == j. Так ли это, что мне нужно делать? Извиняюсь, как новичок S.Obb и Python newb, я не знаю, как лучше всего ответить на следующий вопрос. – user2377057

+0

Большое спасибо @martineau. Я разработал, где код сбой с вашей помощью. С наилучшими пожеланиями – user2377057

1

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

file1 = "C:/temp/file1.txt" # first file 
file2 = "C:/temp/file2.txt" # second file 

m_upper = lambda x: x.upper() # uppercase lambda function. 

# open the files, read them, map using the mapper, 
# and write them back with append. 
def map_file(file_path, append='_upper', mapper=m_upper): 
    file_name, ext = file_path.rsplit('.', 1) 
    new_fp = '%s%s.%s' % (file_name, append, ext) 
    with open(file_path) as f_in, open(new_fp, 'w') as f_out: 
     f_out.write(''.join(map(mapper, f_in))) 

map_file(file1) # file1.txt -> file1_upper.txt (all uppercase) 
map_file(file2) # file2.txt -> file2_upper.txt (all uppercase) 
+0

Спасибо за помощь. Я попробую и отправлю отчет, если понадобится. – user2377057