首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >difflib python格式设置

difflib python格式设置
EN

Stack Overflow用户
提问于 2012-06-20 06:12:13
回答 3查看 2.2K关注 0票数 2

我正在使用这段代码来找出两个csv列表之间的差异,并提出一些格式问题。这可能是一个简单的修复,但我是一个新的,试图学习和有很多问题。

代码语言:javascript
复制
 import difflib

 diff=difflib.ndiff(open('test1.csv',"rb").readlines(), open('test2.csv',"rb").readlines()) 

 try:
  while 1:
    print diff.next(),
except:
 pass

代码运行良好,我得到了我想要的输出:

代码语言:javascript
复制
 Group,Symbol,Total

 - Adam,apple,3850

 ?           ^
 + Adam,apple,2850

 ?           ^
 bob,orange,-45

 bob,lemon,66

 bob,appl,-56

 bob,,88

我的问题是,我如何清理格式,我是否可以将Group,Symbol,Total放入精选列中,并将下面的文本排成一行?

另外,我可以更改吗?来表示我确定的文本?例如,测试1和测试2表示它来自哪个工作表?

谢谢你的帮助

EN

回答 3

Stack Overflow用户

发布于 2012-09-21 04:45:15

使用difflib.unified_diff可以提供更干净的输出,如下所示。

此外,difflib.ndiffdifflib.unified_diff都返回一个Differ对象,它是一个generator对象,您可以直接在for循环中使用它,它知道何时退出,因此您不必自己处理异常。注意:line后面的逗号是为了防止print添加另一个换行符。

代码语言:javascript
复制
import difflib
s1 = ['Adam,apple,3850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
      'bob,appl,-56\n', 'bob,,88\n']
s2 = ['Adam,apple,2850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
      'bob,appl,-56\n', 'bob,,88\n']

for line in difflib.unified_diff(s1, s2, fromfile='test1.csv',
                 tofile='test2.csv'): 
    print line,

这提供了:

代码语言:javascript
复制
--- test1.csv
+++ test2.csv
@@ -1,4 +1,4 @@
-Adam,apple,3850
+Adam,apple,2850
 bob,orange,-45
 bob,lemon,66
 bob,appl,-56

因此,您可以清楚地看到在test1.csvtest1.csv之间更改了哪些行。

票数 5
EN

Stack Overflow用户

发布于 2012-09-21 06:07:04

要对齐列,必须使用字符串格式。

例如,print "%-20s %-20s %-20s" % (row[0],row[1],row[2])

要将?更改为您喜欢的任何文本测试,可以使用s.replace('any text i like')

票数 1
EN

Stack Overflow用户

发布于 2012-09-23 03:54:46

您的问题更多地与CSV格式有关,因为difflib不知道它正在查看列字段。您需要做的是找出向导所指向的字段,以便在打印列时对其进行调整。

如果您的CSV文件很简单,即它们不包含任何带引号的字段和嵌入逗号或(颤栗)换行符,您只需使用split(',')将它们分隔为字段,并找出指南指向的位置,如下所示:

代码语言:javascript
复制
def align(line, guideline):
    """
    Figure out which field the guide (^) points to, and the offset within it.
    E.g., if the guide points 3 chars into field 2, return (2, 3)
    """
    fields = line.split(',')
    guide = guideline.index('^')
    f = p = 0
    while p + len(fields[f]) < guide:
        p += len(fields[f]) + 1     # +1 for the comma
        f += 1
    offset = guide - p
    return f, offset

现在很容易正确地显示向导。假设您想要通过打印所有12个空格宽度的内容来对齐列:

代码语言:javascript
复制
diff=difflib.ndiff(...)
for line in diff:
    code = line[0]  # The diff prefix
    print code,
    if code == '?':
        fld, offset = align(lastline, line[2:])
        for f in range(fld):
            print "%-12s" % '',
        print ' '*offset + '^'
    else:
        fields = line[2:].rstrip('\r\n').split(',')
        for f in fields:
            print "%-12s" % f,
        print
        lastline = line[2:]

需要注意的是,解析CSV文件的唯一可靠方法是使用csv模块(或一个健壮的替代模块);但是让它很好地处理diff格式(完全通用)将是一个令人头痛的问题。如果您主要对可读性感兴趣,并且您的CSV不是太粗糙,那么您可能可以接受偶尔的混淆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11110253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档