首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中为电子表格重新格式化CSV文件

在python中为电子表格重新格式化CSV文件
EN

Stack Overflow用户
提问于 2014-07-05 23:39:24
回答 3查看 183关注 0票数 0

我有一个文本文件text.csv,日期是这样安排的。

代码语言:javascript
复制
name1
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name2
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name3
2011-01-05 (i)
2011-05-05 (i)
2011-06-14 (i)

我想将文件重新格式化或写入2列,如下所示:

代码语言:javascript
复制
+---------------+-----+
| 2010-01-02 (i)|name1|
| 2010-05-07 (i)|name1|
| 2010-06-12 (i)|name1|  
| 2010-01-02 (i)|name2|
| 2010-05-07 (i)|name2|
| 2010-06-12 (i)|name2|
| 2011-01-05 (i)|name3|
| 2011-05-05 (i)|name3|
| 2011-06-14 (i)|name3|
+---------------+-----+

逻辑应该是这样的:

代码语言:javascript
复制
if line doesn't contain "(i)", name=value
else
write date=value, name to file

我不想使用PHP,但我可以遍历数据:

代码语言:javascript
复制
<?php
$file = file($path);
foreach($file as $value)
{
  if ( strpos($value, "(i)" ) !== false)
    $name = $value;

    $fp = fopen('data.csv', 'w');
    fputcsv($fp, $line);
    fclose($fp);
}

你能提供一个可以让我开始的python例子吗?它需要在Libre office calc中作为宏运行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-06 01:10:09

正如我在评论中所说的,您的输入文件不是CSV文件。您可以使用以下代码进行所需的格式化并生成有效的CSV文件。许多电子表格程序可以读取使用逗号或制表符('\t')作为分隔符的CSV文件。

代码语言:javascript
复制
import csv
DELIMITER = ','

with open('data.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter=DELIMITER)
    row = [None, None]
    with open('input_data.txt', 'rt') as textfile:
        for line in (line.strip() for line in textfile):
            if line.endswith('(i)'):
                row[0] = line
                writer.writerow(row)
            else:
                row[1] = line
票数 2
EN

Stack Overflow用户

发布于 2014-07-05 23:45:28

代码语言:javascript
复制
data = '''name1
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name2
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name3
2011-01-05 (i)
2011-05-05 (i)
2011-06-14 (i)'''

name = None
for line in data.splitlines():
    if '(i)' in line:
        print line, name
    else:
        name = line

结果:

代码语言:javascript
复制
2010-01-02 (i) name1
2010-05-07 (i) name1
2010-06-12 (i) name1
2010-01-02 (i) name2
2010-05-07 (i) name2
2010-06-12 (i) name2
2011-01-05 (i) name3
2011-05-05 (i) name3
2011-06-14 (i) name3

现在,您必须读取文件并写入行,而不是print

票数 1
EN

Stack Overflow用户

发布于 2014-07-06 01:23:43

另一种相当简单的方法:

代码语言:javascript
复制
lines = []

with open('original.txt') as f:
    for line in f:
       if line.startswith('name'):
           key = line.rstrip()
       else:
           lines.append('{} {}'.format(line.rstrip(), key))

with open('output.txt', 'w') as f:
    f.writelines(lines)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24587997

复制
相关文章

相似问题

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