以下代码有效,但将多行字符串的每个换行符分配给新行与一个单元格的所需状态。
在研究可能的解决方案时,我读到了:
newline
替换为carriage return
有助于[]
声明尝试了以上所有内容后,我对于为何无法正常工作感到困惑。如果我删除newline
,它会将所有内容分配给行中的单个单元格,但之后很难阅读。
输出带有csv.writer
的字符串时,是否无法保留格式?
def run_rip():
os.chdir('/REGRIPPERDIR/RegRipper2.8')
for k in ntDict:
run_command = "".join(["./rip.pl", " -r /APATH/NTUSER.DAT -p ", str(k)])
process = subprocess.Popen(run_command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = process.communicate()
pattern = re.compile('lastwrite|(\d{2}:\d{2}:\d{2})|alert|trust|Value')
grouping = re.compile('(?P<first>.+?)(\n)(?P<second>.+?)([\n]{2})(?P<rest>.+[\n])', re.MULTILINE | re.DOTALL)
if pattern.findall(out):
match = re.search(grouping, out)
first = match.group('first')
second =match.group('second')
rest = ('"%s' % os.linesep.join([s for s in match.group('rest').splitlines() if s]))
rest = rest.replace('\n','\r\n')
headers = ['Name', 'Description', 'Found']
f = csv.writer(open('/APATH/ntuser.csv', 'ab'),
dialect=csv.excel,
delimiter='\t')
f.writerow(headers)
f.writerow((first, second, rest))
print(out)
ntDict.popitem(last=False)
run_rip()
/ edit:我在下面的评论中要求在收集第三个字符串rest
时发布一个样本。以下文字将传递给csv.writer
。
Baseline\n #First string as defined by the regex
(All) scans a hive\n #Second String as defined by the regex
Total values checked : 64\n #This and below is the rest string
Number of binary value lengths : 11\n
...\n
Value -5: 176 bytes [# times: 1]\n
Value -4: 712 bytes [# times: 5]\n
答案 0 :(得分:2)
不是答案......但我想要代码格式化。
import csv
x = ("1", "2\n3", "4")
f = csv.writer(open('foo', 'w'),
dialect=csv.excel,
delimiter='\t')
f.writerow(x)
产生这个:
$ less foo
1 "2
3" 4
那&#34;有效&#34; tab分隔csv ..它只是excel没有处理它&#34;正确&#34;。引号中的内容实际上是更多的实现问题,因为它不是标准格式。 23周围的额外双引号有点烦人。
查看https://pypi.python.org/pypi/xlwt(pre xml excel格式)或http://xlsxwriter.readthedocs.org/(xml excel格式),以便第三方库直接编写excel。
答案 1 :(得分:0)
在评论的指导下,我找到了答案。只需excel
borks格式化(由于评论中涵盖的原因)。但是,在LibreOffice中打开时,格式将保留。
评论中的建议线程(Importing CSV with line breaks in Excel 2007)有一个专门的解决方法,其中包括引用实际换行符与引用整个字符串,这就是我正在做的事情。
答案 2 :(得分:0)
这就是我解决这个问题的方式。
输入数据:
('firstName.lastName@gmail.com', 'firstName', 'lastName', 'Address1', 'Address1
Address2', 'IP1
IP2
IP3', 'PhoneNumber')
以下是获得相同代码的Python代码:
try: cs.execute(sql) row = cs.fetchone() while row is not None: email = row[0] filename = '{0}.csv'.format(email) with open(filename, "w", encoding='utf-8-sig', newline='') as fp: writer = csv.writer(fp) writer.writerow(('REQUESTER EMAIL', 'FIRST NAME', 'LAST NAME', 'BILLING ADDRESSES', 'SHIPPING ADDRESSES', 'IP ADDRESSES', 'PHONE NUMBER')) writer.writerow(( row[0], row[1], row[2], row[3], row[4], row[5], row[6], )) row = cs.fetchone() finally: cs.close() ctx.close()
查看此行(#7):
open(文件名,“ w”,encoding ='utf-8-sig',newline ='')
为utf-8-sig设置unicode可以解决所有问题。
谢谢, 侯赛因·博赫拉
答案 3 :(得分:0)
您可以简单地使用 \ n 分隔多行单元格中的项目。只要确保整个单元格内容都出现在双引号之间即可:
f =打开(文件名,“ w”,encoding ='utf-8')
f.write('a,b,“ c \ nd” ,e \ n')
此示例在csv文件中写一行,其中第三个单元格有两行 c 和 d 。