我正在使用这段代码来找出两个csv列表之间的差异,并提出一些格式问题。这可能是一个简单的修复,但我是一个新的,试图学习和有很多问题。
import difflib
diff=difflib.ndiff(open('test1.csv',"rb").readlines(), open('test2.csv',"rb").readlines())
try:
while 1:
print diff.next(),
except:
pass代码运行良好,我得到了我想要的输出:
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表示它来自哪个工作表?
谢谢你的帮助
发布于 2012-09-21 04:45:15
使用difflib.unified_diff可以提供更干净的输出,如下所示。
此外,difflib.ndiff和difflib.unified_diff都返回一个Differ对象,它是一个generator对象,您可以直接在for循环中使用它,它知道何时退出,因此您不必自己处理异常。注意:line后面的逗号是为了防止print添加另一个换行符。
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,这提供了:
--- test1.csv
+++ test2.csv
@@ -1,4 +1,4 @@
-Adam,apple,3850
+Adam,apple,2850
bob,orange,-45
bob,lemon,66
bob,appl,-56因此,您可以清楚地看到在test1.csv和test1.csv之间更改了哪些行。
发布于 2012-09-21 06:07:04
要对齐列,必须使用字符串格式。
例如,print "%-20s %-20s %-20s" % (row[0],row[1],row[2])。
要将?更改为您喜欢的任何文本测试,可以使用s.replace('any text i like')。
发布于 2012-09-23 03:54:46
您的问题更多地与CSV格式有关,因为difflib不知道它正在查看列字段。您需要做的是找出向导所指向的字段,以便在打印列时对其进行调整。
如果您的CSV文件很简单,即它们不包含任何带引号的字段和嵌入逗号或(颤栗)换行符,您只需使用split(',')将它们分隔为字段,并找出指南指向的位置,如下所示:
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个空格宽度的内容来对齐列:
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不是太粗糙,那么您可能可以接受偶尔的混淆。
https://stackoverflow.com/questions/11110253
复制相似问题