2015-04-05 26 views
-2

我有如下2个.txt文件:我怎样才能合并2个.txt文件?

letter.txt:

[fname] [lname] 
[street] 
[city] 

Dear [fname]: 

    As a fellow citizen of [city], you and all your neighbours 
on [street] are invited to a celebration this Saturday at 
[city]'s Central Park. Bring beer and food! 

q2.txt:

Michael 

dawn 

lock hart ln 

Dublin 

-- 

kate 

Nan 

webster st 

king city 

-- 

raj 

zakjg 

late Road 

Toronto 

-- 

dave 

porter 

Rock Ave 

nobleton 

-- 

John 

Doe 

round road 

schomberg 

如何合并产生的文件和打印个性化的字母例如第一个地址应该打印:

迈克尔

黎明

锁HART LN

都柏林

亲爱的迈克尔:

都柏林的同胞,你和你的邻居 上锁定HART LN被邀请到一个庆祝这个星期六 都柏林中央公园。带上啤酒和食物!

结论:我怎样才能创建一个函数来合并这2个.txt文件,使个性化的信吗?

我有什么至今:

first_file = open("letter.txt", "r") 

dest_file = open("q2.txt", 'w') 

for line in first_file: 

    v=line.split() 

    for x in v: 

     if x[0]=="fname": 

      dest_file.write(x+"\n") 


first_file.close() 

dest_file.close() 
+0

这肯定是可能的。请告诉我们你到目前为止有什么。 – fuesika 2015-04-05 21:36:41

+0

如果你愿意稍微改变letterFile.txt的格式,你可以使用它作为[Jinja2的(http://jinja.pocoo.org/docs/dev/)模块的模板。 – alexwlchan 2015-04-05 21:37:01

+0

见[字符串格式化](https://docs.python.org/2/library/string.html#formatstrings),尤其是[实施例](https://docs.python.org/2/library/string。 HTML格式#-例子)。 – 2015-04-05 21:43:38

回答

4

一旦你已经发现了如何从你的第二个文件读取的变量,你可以通过多种方式代替它们在你的模板。最简单的方法是使用带变量的.format() method。在模板中,您可以通过在.format()方法中添加{fname}并将它们添加为变量来定义标签。

"""{fname} {lname} 
{street} 
{city} 

Dear {fname}, 

    As a fellow citizen of {city}, you and all your neighbours 
on {street} are invited to a celebration this Saturday at 
{city}'s Central Park. Bring beer and food!""".format(fname='John', lname='Doe', street='Main St', city='Anywhere') 

输出:

John Doe 
Main St 
Anywhere 

Dear John, 

    As a fellow citizen of Anywhere, you and all your neighbours 
on Main St are invited to a celebration this Saturday at 
Anywhere's Central Park. Bring beer and food! 
+0

我想要它,所以我的功能正在做所有的工作。我需要它来查找fname和lname ect,并用地址文件替换它们。 – stacker 2015-04-05 22:37:34

+0

我知道你想要那个,但是你应该把这个方法和你的文件结合起来。你的第一个文件可以用'open()'简单地读取,你应该为第二个文件编写一个解析器,以便它返回一个字典或一个变量列表。然后你可以将它组合成一个产生输出的函数。 – erikgaal 2015-04-05 23:07:56

+0

不完整,但使用格式的好主意。 – Blue 2015-04-05 23:13:18

1

尽量this.I认为最丑的way.Please等待好的答案。

with open('AdressFile.txt') as f: #assuming as a large file 
    for i in f: 
     fname = i 
     next(f,None) #skipping \n 
     lname = next(f,None) 
     next(f,None) #skipping \n 
     street = next(f,None) 
     next(f,None) #skipping \n 
     city = next(f,None) 
     next(f,None) #skipping \n 
     next(f,None) #skipping ----- 
     next(f,None) #skipping \n 

     with open('letterFile.txt') as f1: 
      temp = f1.read() # assuming as a small file 
      temp = temp.replace('[fname]',fname.strip()) 
      temp = temp.replace('[lname]',lname.strip()) 
      temp = temp.replace('[city]',city.strip()) 
      temp = temp.replace('[street]',street.strip()) 
     print(temp) 

#output 
Michael dawn 
lock hart ln 
Dublin 

Dear Michael: 

    As a fellow citizen of Dublin, you and all your neighbours 
on lock hart ln are invited to a celebration this Saturday at 
Dublin's Central Park. Bring beer and food! 

...... 
2

阅读文件:

letter = '' 
q2 = '' 

with open('letter.txt', 'r') as f: 
    letter = f.read() 
f.close() 

with open('q2.txt', 'r') as f: 
    q2 = f.read() 
f.close() 

然后定义一些功能:

def cleanData(query): 
return [item.strip().split('\n\n') for item in query.split('--')] 

def writeLetter(template, variables, replacements): 
    # replace ith variable with ith replacement variable 
    for i in range(len(variables)): 
     template = template.replace(variables[i], replacements[i]) 
    return template 

然后:

variables = ['[fname]', '[lname]', '[street]', '[city]'] 
letters = [writeLetter(letter, variables, person) for person in cleanData(q2)] 

这里有一个[编辑:更新] IPython中的notebook它。

+0

我可以做到这一点,而不包括我的功能模块中的文件? @metasyn – stacker 2015-04-05 22:51:18

+0

是的,你可以单独阅读它们,因为我更新了显示的答案。 – metasyn 2015-04-06 23:33:28