如何使用换行符将字符串存储在 CSV 中?

数据挖掘 Python 数据集 CSV
2021-09-17 03:07:36

我的问题是:我可以通过哪些方式将字符串存储在包含换行符(即\n)的 CSV 中,其中每个数据点都在一行中?

样本数据

这是我拥有的数据样本:

data = [
    ['some text in one line', 1],
    ['text with\nnew line character', 0],
    ['another new\nline character', 1]
]

目标 CSV

我想要一个 CSV 文件,其中第一行是"text,category",后面的每一行都是来自data.

我试过的

使用csvPython 中的包。

import csv
field_names = ['text', 'category']

# Writing
with open('file.csv', 'w+', encoding='utf-8') as file:
    csvwriter = csv.DictWriter(file, field_names)
    csvwriter.writeheader()
    for d in data:
        csvwriter.writerow({'text': d[0], 'category':d[1]})

# Reading
with open('file.csv', 'r', encoding='utf-8') as file:
    csvreader = csv.DictReader(file, field_names)
    data = []
    for line in csvreader:
        data.append([line['text'], line['category']])

我可以读写,但输出file.csv如下:

文本,类别

一行中的一些文本,1

“文字与

换行符",0

“另一个新的

行字符",1

所以每个数据点不是一行。

2个回答

对于仍然面临问题的任何人:

其他建议都不适合我,或者工作量太大。只需在保存到 CSV 之前将所有内容替换\n\\n,它将保留换行符。

df.loc[:, "Column_Name"] = df["Column_Name"].apply(lambda x : x.replace('\n', '\\n'))
df.to_csv("df.csv", index=False)

我假设在从磁盘加载 csv 文件后,出于某种原因,您希望将换行符保留在字符串中。这也是在 Python 中再次完成的。我的解决方案将需要 Python 3,尽管该原理可以应用于 Python 2。

主要技巧

这是\n在写入之前用一个不会包含的奇怪字符替换字符,然后在\n从磁盘读回文件后交换那个奇怪的字符。

对于我的怪异角色,我将使用冰岛刺:Þ,但您可以选择不应该出现在文本变量中的任何内容。它的名称在标准化 Unicode 规范中定义为:LATIN SMALL LETTER THORN您可以通过以下几种方式在 Python 3 中使用它:

weird_name = '\N{LATIN SMALL LETTER THORN}'
weird_char = '\xfe'             # hex representation
weird_name == weird_char        # True

\N很酷(并且在格式化字符串中也可以在 python 3.6 中使用)......它基本上允许您根据 Unicode 的规范传递字符的名称。

更换\n

现在我们用这个奇怪的字符来替换'\n'. 为了实现这一目标,我想到了两种方法:

  1. 在列表列表中使用列表理解data::

    new_data = [[sample[0].replace('\n', weird_char) + weird_char, sample[1]]
                 for sample in data]
    
  2. 将数据放入数据框中,并text一次性在整个列上使用替换

    df1 = pd.DataFrame(data, columns=['text', 'category'])
    df1.text = df.text.str.replace('\n', weird_char)
    

生成的数据框如下所示,替换了换行符:

               text              category
0         some text in one line      1   
1  text withþnew line character      0   
2    another newþline character      1   

将结果写入磁盘

现在我们将这些相同的数据帧中的任何一个写入磁盘。正如你所说,我设置index=False了你不希望行号出现在 CSV 中:

FILE = '~/path/to/test_file.csv'
df.to_csv(FILE, index=False)

它在磁盘上是什么样子的?

文本,类别

一行中的一些文本,1

带有þ换行符的文本,0

另一个换行符,1

从磁盘取回原始数据

从文件中读回数据:

new_df = pd.read_csv(FILE)

我们可以将Þ字符替换回\n

new_df.text = new_df.text.str.replace(weird_char, '\n')

最后的DataFrame:

new_df
               text               category
0          some text in one line      1   
1  text with\nnew line character      0   
2    another new\nline character      1   

如果您希望将内容重新添加到列表列表中,则可以执行以下操作:

original_lists = [[text, category] for index, text, category in old_df_again.itertuples()]

看起来像这样:

[['some text in one line', 1],
 ['text with\nnew line character', 0],
 ['another new\nline character', 1]]