免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5271 | 回复: 8
打印 上一主题 下一主题

用python实现两个文件中内容替换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-14 15:19 |只看该作者 |倒序浏览
文件afile的内容有3列,行数若干。文件bfile格式与文件afile格式相同,现在想用bfile的第2行第1列值替换afile第三行第2列值,请问有什么好方法么?先谢了!

论坛徽章:
0
2 [报告]
发表于 2013-11-14 15:22 |只看该作者
帮顶下。。                             

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2013-11-14 16:04 |只看该作者
伪代码,因为很多信息不清楚:

打开b文件,
读取到第二行,
抓取第一列信息(估计正则、split什么的都可以考虑下,因为列已经清楚了,分割应当是比较容易的)
关闭b文件

读写模式打开a文件,
一次性全部读到内存中--如果文件不大的话
在内存中把对应的内容代换
调节文件读写位置(file.seek(0))
内容写入文件

如果文件大的话,可以考虑先建立临时文件,然后一个读临时文件,一个用来住回写。

论坛徽章:
0
4 [报告]
发表于 2013-11-14 16:46 |只看该作者
a文件和b文件分别是这样的格式,都是以空格分隔的。
a文件
a b 2013-11-12
c d 2013-11-13
e f 2013-11-14

b文件
12 34 37
73 349 3
8 31 1

楼上这位朋友的方法我有几点疑问,一是如何抓取某行某列,二是file.seek()的位置是按字符移位的吧,如何能按空格分隔的块选择写入呢?

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2013-11-14 16:54 |只看该作者
回复 4# okrush


    1. 找到某列:在读文件时,有readline/readlines可以使用,或者,可以自行使用\n来作为一行的结尾判断,这样你就可以自己计数是读了几行了。
    2. 按照提供的样例数据,你可以用最简单的字符串分割来找到特定列的数据 a_line.split(' '),然后,对应第一列,你可以通过[0]去访问到,第二列用[1],以此类推。
    3. seek是从文件头开始移动指定的位置(如果没有记错,是这样的,如果记错了,请按系统文档说明重新计算偏移量),提供一个0L,可以让读或者写的位置恢复到开头。
    暂时就这些了。

论坛徽章:
0
6 [报告]
发表于 2013-11-19 15:20 |只看该作者
获取指定的数据我了解了,但是写入到指定位置我还是没太明白,
比如现在已经取到数值并赋值给变量
abc=73
然后怎么用这个值替换掉a文件的指定位置上的值呢?
我看了一下seek这个函数,它好像只能指定字节位置,没法识别以空格为分隔的块吧?
麻烦了解的朋友给个示例代码吧。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
7 [报告]
发表于 2013-11-19 17:23 |只看该作者
  1. import os


  2. def read_content(filename):
  3.     '''assume file size is not big to affect operation, return all content in list.'''
  4.     result = []

  5.     if not os.path.exists(filename):
  6.         return result

  7.     try:
  8.         file_handle = open(filename)
  9.         result = file_handle.readlines()
  10.     except IOError:
  11.         pass
  12.     finally:
  13.         file_handle.close()
  14.         return result

  15. def switch_content(source, target, pos1, pos2):
  16.     '''use 2 tuple (row, col): pos1, pos2; to mark related switching position in source & target.'''
  17.     line_s = source[pos1[0] - 1]
  18.     line_t = target[pos2[0] - 1]
  19.     s_list = line_s.split(' ')
  20.     t_list = line_t.split(' ') # ''之间是有一个空格的
  21.     t_list[pos2[1]-1] = s_list[pos1[1]-1]
  22.     line_t = ' '.join(t_list)  # ''之间是有一个空格的
  23.     target[pos2[0]-1] = line_t
  24.     return target

  25. def dump_result(filename, content):
  26.     '''Dump content--list, into specified file.'''
  27.     try:
  28.         file_handle = open(filename, "w")
  29.         file_handle.writelines(content)
  30.         file_handle.close()
  31.         return True
  32.     except IOError:
  33.         return False

  34. def main():
  35.     source1 = read_content('a.txt')
  36.     source2 = read_content('b.txt')
  37.     content = switch_content(source1, source2, (2, 1), (3, 2))
  38.     dump_result('b.txt', content)

  39. if __name__ == '__main__':
  40.     main()
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-11-20 10:57 |只看该作者
这个问题我以前也问过,结果最终答案就是在创建一个新文件重新写一遍,在写的过程中替换,

直接替换很难

论坛徽章:
0
9 [报告]
发表于 2013-11-22 23:00 |只看该作者
本帖最后由 inpool 于 2013-11-22 23:01 编辑
  1. #! /usr/bin/env python

  2. def file2list(filename):
  3.     result = []
  4.     for line in open(filename):
  5.         result.append(line.strip().split())
  6.     return result

  7. def list2file(list_, filename)
  8.     output = open(filename, 'w')
  9.     for line in list_:
  10.         output.write(' '.join(line) + '\n')
  11.     output.close()

  12. if __name__ == __main__:
  13.     file_a = file2list('a.txt')
  14.     file_b = file2list('b.txt')
  15.     file_a[2][1] = file_b[1][0]
  16.     list2file(file_a, 'a.txt')
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP