在固定数量的元素之后在 python 文件中插入换行符以分隔 csv 文件中的列

insert line break in python file after a fix number of elements to delimit columns in a csv file

我一直在努力在 python 中找到一种方法来强制此文件在一定数量的元素(等于我需要的列数)之后创建一个跳转到新行添加这是 12) CSV 当前看起来像这样。

第一行的文字如下所示。

D276",31386,10610,12122021 00:00:47840 85,0.00+842646,M000395708109323,ACTIVE CARD CHECK,844-6593879,NY,59655,840 6511011091718056,D27011091718056,D270,12056,D270,12056,D276,12056 [ 29=],5.36-842647,M527021000201360,Etsy.com - TheCraftyCa 布鲁克林,纽约,56995,840 6511011091718056,D276,86495,29807,12122021 00:08:22840N51,11.99-843648,7170,M247 *youtubremium g。co/helppay#ca,78295,840 6511016547548056,D276,29969,10038,12122021 [= 31 = 31 = 31 =] 57,11.30-842649,11.30-842649,麦克罗,62521,21152,12122021 00:28:54840N51,5.40-842650,M527021000211443,Google Play,Mountain View CA,58175,840 651101101111173278056,D276,496,496,1222222222222222222222222222222222111111111111111111111111111111111111111111111111111111111111111112229999999999太体[ ,AMZN MKTP US,AMZN。 ,D276,125175,45529,12122021 00:31:50840Y05,0.00+842653,M145376000144509,PLAYSTATION网络,800-345-7669 CA,58165,840 6511020299078056,D276,1251 75,45529,12122021 00:32:07840Y57,21.44-842654,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:08840Y57,21.44-842299,M527021000222747 ,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:09840Y57,21.44-842300,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529, 12122021 00:32:09840 57,0.00+842655,MCARD ACCPT IDC,Sony - Playstation N.. St. Louis,USA,59695,840 6511020299078056,D276,125175,45529,12122021 00:32:27840Y57,21.44-842301, M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:28840Y57,21.44-842657,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276, 125175,45529,12122021 00:32:28840Y57,21.44-842656,M527021000222747,PLAYSTATIONNETWORK,SAN MATEO,CA,CA,58185,840 6511020202999078056,D278056,1276,125155555555555555555555555555555555555555太平洋,Sony - Playstation N.. St. Louis,USA,59695,840 651102029907 8056,D276,112802,40216,12122021 00:32:30840Y00,6.49-842659,M784959000762203,Amazon.com,Amzn.com/bill WA,59425,840 6511019112388056,D276,1211=29207,124 [ 45 =] 05,3.12-67433,P536385810103481,米尔斯食品中心,加利福尼亚州奥克兰,54115,840 6511019841028056,D276,120407,44199,199,12122021 [ CA,54115,840 6511019841028056,D276,129143,47047,12122021

我希望它看起来像这样

继续,直到完成原始文件中的所有寄存器。

我要尝试的第一件事就是简单地用逗号分隔行,然后使用 csv.writer 写入记录,一次用十二个元素调用 .writerow()。我注意到你在开头有一个双引号,但后来没有,所以这种方法可能就足够了,你只需要删除那个双引号。当然,如果您的文件中的任何字段在其文本中包含逗号,我的建议就会落空,但这是一个开始的地方,因为您似乎是在尝试修复一个特定的文件,而不是解决一般问题。

这是我对该建议的实施:

import csv

out_f = open("fixed-csv.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
    for line in in_f:
        fields = line.strip("\n\r").split(",")
        for position in range(0, len(fields), 12):
            writer.writerow(fields[position:position+12])

现在,我注意到 运行 该代码实际上每行并非恰好有 12 列,它更像是 10 或 11,而且不是常数。

这是一个查找 D276 并使其成为每一行的第一列的变体:

import csv

out_f = open("fixed-csv-2.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
    for line in in_f:
        fields = line.strip("\n\r").split(",")
        d276_positions = [
            i
            for i, value in enumerate(fields)
            if i == 0 or value == "D276"
        ]
        d276_positions.append(len(fields))
        for start, end in zip(d276_positions, d276_positions[1:]):
            writer.writerow(fields[start:end])

我不认为您的所有数据都会将 D276 作为行中的第一个值,因此您可能必须将 if i == 0 or value == "D276" 更改为更普遍地定位标记 a 的字段的值新行,但是这段代码应该让你知道你需要解决你的问题,假设,正如我在开头所说的那样,你的整个数据文件中的任何字段中都没有逗号。

如果您的某些字段中确实有逗号,我会使用文本编辑器手动编辑输出文件并手动修补问题。如果没有太多,应该不会有很多工作。

这是 pandas + numpy 方法。

import io
import numpy as np
import pandas as pd
data =""""
D276",31386,10610,12122021 00:00:47840 85,...
"""

df = pd.read_csv(io.StringIO(data), delimiter=",", quoting=3, header=None)

# resize array to multiple of cols
cols = 11
remainder = cols - df.shape[1] % cols
values = np.append(df.to_numpy(), np.empty((1,remainder)))

df_reshaped = pd.DataFrame(values.reshape((-1,cols)))

输出:

0   1   2   3   4   5   6   7   8   9   10
0   D276"   31386   10610   12122021 00:00:47840 85 0.00+842646 M000395708109323    ACTIVE CARD CHECK   844-6593879 NY  59655   840 6511011091718056
1   D276    31386   10610   12122021 00:00:59840Y00 5.36-842647 M527021000201360    Etsy.com - TheCraftyCa Brooklyn NY  56995   840 6511011091718056    D276
2   86495   29807   12122021 00:08:22840N51 11.99-842648    M248747000103177    GOOGLE *YouTubePremium g.co/helppay# CA 78295   840 6511016547548056    D276    29969   10038

请注意,在 cols 列之后中断仅适用于前两行。您可能需要考虑另一个标准 e。 G。 'D276',如 joanis 的回答。