2016-06-21 64 views
0

我的意图是在文件1的冒号或等号之后复制一段字符串,并将该字符串粘贴到文件2中在冒号或等号后​​的相似位置。从一个文件的特定索引中复制字符串,将该字符串粘贴到另一个文件中的特定位置

例如,如果文件1有: 用户名:堆栈

文件2原本是空的: 用户名=

我想栈能够复制的用户名后,文件2。目前,我卡住了,不知道该怎么做。我在下面制作的程序片段不会复制用户名。我将非常感谢任何输入!

with open("C:/Users/SO//Downloads//f1.txt", "r") as f1: 
    with open("C:/Users/SO//Downloads//f2.txt", "r+") as f2: 
     searchlines = f1.readlines() 
     searchlines_f2=f2.readlines()   
     for i, line in enumerate(searchlines): 
      if 'username' in line: 
       for l in searchlines[i:i+1]: 
        ind = max(l.find(':'), l.find('='), 0) #finding index of specific characters 
        copy_string=l[ind+1:].strip() #copying string for file 2 
        for l in searchlines_f2[i:i+1]: 
         if 'username' in line: 
          f2.write(copy_string) 
+0

你可以相信,在每个文件的行数始终是相同的?你会在每个文件中遇到多个'username'实例吗? –

+0

@JordanBonitatis每个文件中的行数预计不会相同,并且每个文件中不会遇到多个实例。 – Neil

回答

1

我觉得像这样的东西会让你得到你需要的更多维护和Pythonic的方式。

注意使用正则表达式以及一些字符串方法(例如,startswith

import re 

SOURCE_PATH = "C:/Users/SO//Downloads//f1.txt" 
TARGET_PATH = "C:/Users/SO//Downloads//f2.txt" 

def _get_lines(filepath): 
    """ read `filepath` and return a list of strings """ 
    with open(filepath, "r+") as fh: 
     return fh.readlines()  

def _get_value(fieldname, text): 
    """ parse `text` to get the value of `fieldname` """ 
    try: 
     pattern = '%s[:=]{1}\s?(.*)' % fieldname 
     return re.match(pattern, text).group(1) 
    except IndexError: 
     # you may want to handle this differently! 
     return None 

def _write_target(filepath, trgt_lines): 
    """ write `trgt_lines` to `filepath` """ 
    with open(filepath, "w+") as fh: 
     fh.writelines(trgt_lines) 

src_lines = _get_lines(SOURCE_PATH) 
trgt_lines = _get_lines(TARGET_PATH) 

# extract field values from source file 
fields = ['username', 'id', 'location'] 
for field in fields: 
    value = None 
    for cur_src in src_lines: 
     if cur_src.startswith(field): 
      value = _get_value(field, cur_src) 
      break 

    # update target_file w/ value (if we were able to find it) 
    if value is not None: 
     for i, cur_trgt in enumerate(trgt_lines): 
      if cur_trgt.startswith('{0}='.format(field)): 
       trgt_lines[i] = '{0}={1}'.format(field, value) 
       break 
_write_target(TARGET_PATH, trgt_lines) 
+0

你能解释一下这条线是干什么的吗? re.match('username [:=] {1} \ s?(。*)',text).group(1) – Neil

+0

@neil - sure;该行正在调用're'(即正则表达式)库的'match'函数并返回找到的第一个匹配项(匹配函数可以搜索多个匹配项)。正则表达式是非常强大的文本解析/操作工具。在这种情况下,我们匹配的模式是带有“用户名”的任何字符串,后跟正好是一个冒号,或者只有一个等号和0个或多个空格,然后匹配该模式后面的所有内容。看看这个方便的[备忘单](https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/) –

+0

谢谢,备忘单真的很有帮助!你提供的程序使得它改变了用户名后的行间距,有没有办法解决这个问题?我一直试图在头上围住它几天。你知道是否有办法让'_get_username'函数更通用,这样它可以从源文件中获得字段名(例如用户名,ID号等),程序可以在目标文件中找到最佳匹配项?如果你能指出我正确的方向,我会很感激。 – Neil