2012-02-03 87 views
-1

我有一个包含类似以下信息的文件:更换的每个实例“ - ”从文件

1/1/2010 
1-2-3-4 
1 
1/2/2010 
1-5-6-7 
111 
etc. 

我希望能够写这其中'-'每个实例都替换为另一个文件','。我一直在使用str.split('-')尝试并实现收到此错误
TypeError: must be string or read-only character buffer, not list
我也使用str.replace('-', 'i')尝试后,我不能写一个列表文件,但所有这一切给了我另外一个错误
TypeError: replace() takes at least 2 arguments (1 given)
任何人都可以点我在正确的方向?

我还要指出,我试图首先使用str.split()的原因是因为这最终都将被放入一个字典,像这样

{0:[['1/1/2010], ['1', '2', '3', '4'], ['1']], 1: [['1/2/2010'], ['1', '5', '6', '7'], ['111']], etc.} 

只是一个更新... 我发现使用未提及的正则表达式执行此操作的简单方法。

>>> def test(filename): 
import re 
input_file = open(filename, 'r') 
output_file = open('test.txt', "w") 
for line in input_file: 
    line = line.strip() 
    line = re.sub('-', ',', line) 
    output_file.write(line) 
    output_file.write('\n') 
input_file.close() 
output_file.close() 
+1

这是否被集成到另一个程序中?你需要为这一步使用python吗?如果不是为什么不是shell命令:cat file | “tr” - “”,“ – Benedict 2012-02-03 18:43:06

回答

3
def replaceAll(infilepath, outfilepath): 
    infile = open(infilepath) 
    outfile = open(outfilepath, 'w') 
    for line in infile: 
     outfile.write(line.replace('-', ',')) 
    infile.close() 
    outfile.close() 

编辑:这里是这样做的稍微更Python的方式:

def replaceAll(infilepath, outfilepath): 
    with open(infilepath) as infile, open(outfilepath, 'w') as outfile: 
     for line in infile: 
      outfile.write(line.replace('-', ',')) 
+0

工作。感谢您提供一些比'replace(' - ',',')'更多的东西。 – Timmay 2012-02-03 22:35:48

0

尝试使用此

replace("-",","); 
+0

也许是因为我不知道足够的Python,但是当我在这个文件中使用尝试阅读行时,它不起作用。即'line.replace(“ - ”,“,”)'拷贝到文件的所有内容是它正在读取的文件的第一行。 – Timmay 2012-02-03 22:22:47

+0

从Python文档中查看此页面的最底部:http://docs.python.org/library/string.html – 2012-02-03 22:25:27

+0

'replace'会返回一个新的'str'。你调用它的那个没有改变。这很不明显,并导致丑陋的代码,如'message = message.replace(“ - ”,“,”)'。在另一个说明中,在这个答案的最后的分号不属于。 – ArtOfWarfare 2013-10-08 20:34:28

1

我建议你使用正则表达式来解析您的文件格式是否为这种一致的,这里有一个例子:

import os, re 

data = """1/1/2010 
1-2-3-4 
1 
1/2/2010 
1-5-6-7 
111""" 

regex = re.compile(os.linesep.join([r'(\d{1,2}/\d{1,2}/\d{4})', 
            r'(\d+-\d+-\d+-\d+)', 
            r'(\d+)'])) 
groups = {} 
n = 0 
for match in regex.finditer(data): 
    groups[n] = [[match.group(1)], match.group(2).split('-'), [match.group(3)]] 
    n += 1 

>>> groups 
{0: [['1/1/2010'], ['1', '2', '3', '4'], ['1']], 1: [['1/2/2010'], ['1', '5', '6', '7'], ['111']]} 

至于你的问题(如何用逗号替换连字符),假设您已将文件读入字符串data,则可以使用以下行代替所有连字符:

data = data.replace('-', ',') 

你也可以分割字符串的所有'-'然后用','.join(),虽然使用str.replace()简单:

data = ','.join(data.split('-')) 
+0

我只用我的数据样本(9行)尝试了上面的内容,并返回了{}'。 – Timmay 2012-02-03 18:56:14

+0

如果你的行有任何尾随空格,或者文件有奇怪的行结尾,这可能不起作用,你能用你试过的行编辑你的问题吗? – 2012-02-03 19:16:46

+0

我已经尝试过它,但是当我输入组时,它仍然给我提供'{}'。你在使用2.7.2吗? – Timmay 2012-02-03 22:21:23

0

我创建了一个测试文件给你看。

>>> contents = open('test.txt', 'r').read() 
>>> contents 
'blah-blah\nsomething-\n' 

使用字符串替换方法与,取代的-出现:首先,在阅读

>>> contents_replaced = contents.replace('-', ',') 
>>> contents_replaced 
'blah,blah\nsomething,\n' 

写回了一个文件,并在阅读它,以确保它已更新:

>>> open('test2.txt', 'w').write(contents_replaced) 
>>> open('test2.txt', 'r').read() 
'blah,blah\nsomething,\n'