2016-04-24 52 views
0

我有一个txt文件,它看起来像:拆分一个TXT与特定名称的几个txt文件在Python

24.03.2016 Peso 
27.03.2016 Ruble 
18.04.2016 Euro 
17.05.2016 Dollar 
16.06.2016 Frank 

我需要它在不同的文件分割,而一个新的文件名应该是日期和这个文件的填充 - 剩下的。例如 - 名称是18.04.2016并且文件内部是欧元

但是,如果它的月份相同(如03.2016这里),我需要把它全部放在一个文件中,并用本月的第一个日期的名称。例如 - 名称是24.03.2016,里面是比索/ n卢布

我该怎么做?现在我只能在逐行读取我的文件行步骤:

with open("Data.txt", 'r', encoding="utf-8") as fp: 
    for line in fp: 
     read (line) 
+0

您可以将其存储在一个格式为“{'03 .2016':(firstDate,list of names)}''的字典中。然后浏览字典中的每个条目并将它们写出到相应的文件中。 –

+0

我试图用dict(item.split(“”)代替line.split(“:”))中的项目,但我的一些数据在一个字符串中已经有了“”(比如比索卢布美元) ,所以python说ValueError:字典更新序列元素#0的长度为4; 2是必需的。如何在这种情况下? – Polly

回答

1

你可以使用Python的groupby功能组线与匹配月份和年份从文件。 lambda函数使用split()两次提取月份和年份,首先将每行分割一个空格,然后将第一个条目拆分为.以获取3个日期分量并返回月份/年份部分。

则该论坛,那么你可以创建基于此组中的第一项的文件名的文件,如下所示中的每个条目:

from itertools import groupby 


with open('data.txt') as f_input: 
    for k, g in groupby(f_input, lambda x: x.split()[0].split('.')[1:]): 
     entries = list(g) 
     with open(entries[0].split()[0], 'w') as f_output: 
      for line in entries: 
       print line 
       f_output.write(line.split(' ', 1)[1].lstrip()) 

这将导致以下4个文件被创建:

24.03.2016 
18.04.2016 
17.05.2016      
16.06.2016 

24.03.2016文件,例如将包含:

Peso 
Ruble 

请注意,这假定您在data.txt中的条目按时间顺序排列。

+0

马丁,如果我有一个字符串与完整的句子旁边的日期,例如,“比索卢布,美元!弗兰克?”?我想把所有这个字符串放在我的新文件中? – Polly

+0

我已经对脚本进行了必要的更改。我现在要写整行。 –

+0

太棒了,它的作品!非常感谢你! – Polly

1

事情是这样的:

#!python3 
import collections 

seen = collections.defaultdict(list) 

with open("Data.txt", 'r', encoding="utf-8") as fp: 
    for line in fp: 
     line = line.strip() 
     if not line: 
      continue 

     date,currency = line.split() 
     month = date[3:] 

     seen[month].append((date,currency)) 

for month in seen.keys(): 
    with open(seen[month][0][0], 'w') as outfile: 
     print(file=outfile, 
      "\n".join(currency for date,currency in seen[month])) 
+0

它说SyntaxError:非关键字arg关键字arg在字符串打印(文件= outfile,“\ n”.join(货币对日期,货币在看到[月]))... – Polly

+0

无赖。你必须将'file = outfile'移到最后。 –

1

您可以将所有的几个月和相应的数据(每月的第一天,清单的货币)作为字典中的键值对。然后,可以将字典写入文件,文件的名称将基于月份的第一个日期以及列表中剩余值的内容。

dict = {} 
with open("Data.txt", 'r', encoding="utf-8") as fp: 
    for line in fp: 
     tokens = line.split() 
     date = tokens[0] 
     names = tokens[1:] 
     list_of_names = dict.get(date[3:], []) # get existing list of names or new list if key does not exist. 
     if not list_of_names: 
      list_of_names.append(date) 
      list_of_names.extend(names) 
     else: 
      list_of_names.extend(names) 
     dict[date[3:]] = list_of_names 

for date, list_of_names in dict.iteritems(): 
    with open(list_of_names[0] +'.txt', 'w') as f: 
    f.write('\n'.join(list_of_names[1:]))  # write all names in one go 
+0

这里我得到的错误,说 ValueError:太多的值解压(预期2)在日期,名称= line.split(),因为我明白,因为在一些字符串我不仅“日期比索”,而是“日期比索卢布美元“。我怎样才能解决它?:) – Polly

+0

@Polly编辑...让我知道如果它有帮助 – trans1st0r