Python将多行字符串输出到单个csv.writer行

时间:2016-02-19 19:02:00

标签: python-2.7 csv

以下代码有效,但将多行字符串的每个换行符分配给新行与一个单元格的所需状态。

在研究可能的解决方案时,我读到了:

  • 我应该尝试用双引号将字符串括起来
  • 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()

示例输出: Three Column Output

/ 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

期望状态: enter image description here

4 个答案:

答案 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')

所需的CSV格式: enter image description here

以下是获得相同代码的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