迭代行并将其合并(如果它们不以数字开头)

时间:2018-07-31 18:57:44

标签: python python-3.x csv

在合并1-7行时,是否可以将它们显示在csv文件中的一行上,我可以得到一些帮助吗?我试图将其放入数据框,但格式将第一列中的数据弄乱了。

1527047244357,'line_A','{}','{
<gpx abcd>
    <rte>
        <name>defg</name>
    </rte>
</gpx>
}'
1527047244358,'line_B'

我正在使用的每个csv文件中都有数千行,这些行在文件中随机出现。我在想,也许for循环会起作用,以检查第一个字符是否为数字,如果不是,请删除换行符,以便获得所需的内容:

1527047244357,'line_A','{}','{<gpx abcd><rte><name>defg</name></rte></gpx>}'
1527047244358,'line_B'

我该如何完成?到目前为止,这是我的伪代码:

for row in readerObj:
    if isinstance(row[0], int) == True:
         (delete line break)
    csvWriter.writerow(row)

4 个答案:

答案 0 :(得分:1)

大多数csv数据使用"作为引号字符。您可以使用'来代替,它可以由csv.readerpd.read_csv支持的quotechar参数进行控制:

In [61]: pd.read_csv("data.csv", quotechar="'", header=None)
Out[61]: 
               0       1    2                                                  3
0  1527047244357  line_A   {}  {\r\n<gpx abcd>\r\n    <rte>\r\n        <name>...
1  1527047244358  line_B  NaN                                                NaN

有了这个,就可以适当地剥离。

答案 1 :(得分:0)

这是一种方法。

演示:

s = """1527047244357,'line_A','{}','{
<gpx abcd>
    <rte>
        <name>defg</name>
    </rte>
</gpx>
}'
1527047244358,'line_B'"""

res = [[]]
checkVal = False
for line in s.splitlines():             #Iterate Each line
    if line.strip().endswith("{"):      #Check if line ends with {
        checkVal = True
    if line.strip().endswith("}'"):     #Check if line ends with }
        checkVal = False
        res[-1].append(line)
        continue

    if checkVal:
        res[-1].append(line)
    else:
        res.append([line])

for i in res:
    print(" ".join(i))

输出:

1527047244357,'line_A','{}','{ <gpx abcd>     <rte>         <name>defg</name>     </rte> </gpx> }'
1527047244358,'line_B'

答案 2 :(得分:0)

一次读取一行原始文件,并将这些行写入输出文件而不会出现换行符,除非一行以数字开头(在这种情况下,它是下一行和一行)必须在其前面插入中断):

import re
with open("original.csv") as infile:
    with open("fixed.csv", "w") as outfile:
        for lineno,line in enumerate(infile):
            # The beginning of the next row
            if re.match('\d+,', line) and lineno > 0: 
                outfile.write('\n')
            outfile.write(line.rstrip())

变量lineno防止代码在文件的开头插入换行符。使用此方法,您可以处理任意长文件,因为您始终最多只能处理一行。

答案 3 :(得分:0)

我试图使其与您的代码相似并且易于理解。

readerObj = """1527047244357,'line_A','{}','{
<gpx abcd>
    <rte>
        <name>defg</name>
    </rte>
</gpx>
}'
1527047244358,'line_B'"""

temp_csv = ''

for line in readerObj.splitlines():
    line_splitted = line.split(',')
    dumped_whitespaces = [el.strip(' ') for el in line_splitted]
    first_obj = line_splitted[0]

    # that's the recommended way to check if something is a digit
    if first_obj.isdigit():
        # adds new line
        temp_csv += "\n"

    temp_csv += ','.join(dumped_whitespaces)

with open('yourfile.csv', 'w') as f:
    f.write(temp_csv)

结果

1527047244357,'line_A','{}','{<gpx abcd><rte><name>defg</name></rte></gpx>}'
1527047244358,'line_B'

如果您需要确保一切正常,请使用熊猫。