鱼C论坛

 找回密码
 立即注册
查看: 4561|回复: 28

求高手求高手求高手---按规律合并三个文件

[复制链接]
发表于 2016-2-17 19:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬天的哈根达斯 于 2016-2-17 19:57 编辑

文件1.txt内容如下:                              
a        b        c        d        e
a1        11        A        0        286
a1        21        CG        13        44
a1        23        C        52        15
a1        24        AG        68        14
a1        36        AG        59        12

文件2.txt内容如下:
a        b        c        d        e
a1        11        A        0        130
a1        21        CG        13        47
a1        23        C        47        12
a1        24        AG        35        20
a1        32        C        38        41
a1        33        A        81        13
a1        36        AG        65        18
a1        37        CT        72        11

文件3.txt内容如下:
a        b        c        d        e
a1        11        A        0        264
a1        21        CG        37        23
a1        32        C        34        29
a1        33        A        51        14
a1        34        CT        54        7
a1        36        AG        54        6

合并后为4.txt内容如下:
截图02.png

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-17 20:07:34 | 显示全部楼层
1, 2, 3文件按行合并
再对每行进行去重
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 20:17:07 | 显示全部楼层
hldh214 发表于 2016-2-17 20:07
1, 2, 3文件按行合并
再对每行进行去重

如何对每行去重
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-17 20:18:31 | 显示全部楼层

找规律啦, 先以空格为分隔符, 生成列表, 对列表去重简单吧, for循环的事~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 20:21:39 | 显示全部楼层
hldh214 发表于 2016-2-17 20:18
找规律啦, 先以空格为分隔符, 生成列表, 对列表去重简单吧, for循环的事~

按行合并不行,你仔细看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-17 20:38:27 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-17 20:21
按行合并不行,你仔细看

你说说呗~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 20:40:59 | 显示全部楼层


三个文件的行数都不一样,合并后的第四个文件是前三个文件的互补。前三个文件最多的只有9行,合并后的第四个文件是10行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-17 21:08:01 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-17 20:40
三个文件的行数都不一样,合并后的第四个文件是前三个文件的互补。前三个文件最多的只有9行,合并后的 ...

没懂你的意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 21:23:50 | 显示全部楼层

for循环对列表去重怎么写?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-17 21:44:22 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-17 21:23
for循环对列表去重怎么写?

先声明一个列表放结果
for each in 需要去重的列表:
    if each not in 需要去重的列表:
        声明的列表.append(each)


这是最简单最易懂的了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 23:18:51 | 显示全部楼层

三个文件的行数都不一样,怎么能按行合并呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 09:12:09 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-17 23:18
三个文件的行数都不一样,怎么能按行合并呢

多余行往下排
用for循环遍历3文件之一 写入目标文件
再遍历, 同时遍历目标文件, 判断行号, 待写入的文件行号大于目标文件时, 直接在末尾追加
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 13:23:27 | 显示全部楼层
hldh214 发表于 2016-2-18 09:12
多余行往下排
用for循环遍历3文件之一 写入目标文件
再遍历, 同时遍历目标文件, 判断行号, 待写入的文 ...

再遍历, 同时遍历目标文件, 判断行号, 待写入的文件行号大于目标文件时, 直接在末尾追加:这部分的代码不会写,麻烦写个参考,谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 13:45:36 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-18 13:23
再遍历, 同时遍历目标文件, 判断行号, 待写入的文件行号大于目标文件时, 直接在末尾追加:这部分的代码不 ...

卧槽, for循环呀, 你是不知道判断行号吗?用enumerate()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 14:24:12 | 显示全部楼层
hldh214 发表于 2016-2-18 13:45
卧槽, for循环呀, 你是不知道判断行号吗?用enumerate()

真不知道!感谢你的耐心教导!谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 15:38:59 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-18 14:24
真不知道!感谢你的耐心教导!谢谢

好像用列表解析要简单点...凑合用吧
  1. # origin.txt 是行数较大的
  2. # target.txt 是行数较小的
  3. # 返回target列表就是合并后的

  4. origin = open('origin.txt', 'r')
  5. target = open('target.txt', 'r')

  6. origin = list(origin)
  7. target = list(target)

  8. origin_len = len(origin)
  9. target_len = len(target)

  10. # for each in range(origin_len):
  11. #     if each < target_len:
  12. #         target[each] = origin[each] + target[each]
  13. #     else:
  14. #         target.append(origin[each])

  15. target = [origin[each] + target[each] if each < target_len else origin[each] for each in range(origin_len)]

  16. print(target)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 15:55:30 | 显示全部楼层
hldh214 发表于 2016-2-18 15:38
好像用列表解析要简单点...凑合用吧

非常感谢我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 16:22:25 | 显示全部楼层
hldh214 发表于 2016-2-18 15:38
好像用列表解析要简单点...凑合用吧

输出结果是这样的,好像不对
截图06.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 16:49:46 | 显示全部楼层
hldh214 发表于 2016-2-18 15:38
好像用列表解析要简单点...凑合用吧

target[each] = origin[each] + target[each]
这行里面的
origin[each]和 target[each]这两个参数从哪里得来?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 16:53:58 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-18 16:49
target[each] = origin[each] + target[each]
这行里面的
origin[each]和 target[each]这两个参数从哪 ...

origin target 是两个列表, 用for迭代出了each 传入两个列表, 你那个不行是因为换行符, 你给每个文件末尾加一行空行再试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表