Python:遍历CSV的每一行,计数每一行中的令牌,创建一个具有原始CSV每行令牌数量的新CSV

时间:2018-06-24 13:44:21

标签: python loops csv

我有一个如下所示的CSV文件:

  

Blockquote

  • ID内容
  • 文本1来一些文本
  • 文字2她也来了一些文字
  • 文本3等等,依此类推...
  

Blockquote

我想编写一个代码来遍历此CSV表的每一行。 然后计算每行(例如每个文本)中令牌的数量 然后,创建一个新的CSV表作为输出,该表中应仅是带有该文本中令牌数量的Text-ID。

  

Blockquote

输出CSV文件应如下所示:

  • ID NumberOfTokens
  • 文本1 8
  • 文本2 12
  • 文本3 15
  

Blockquote

到目前为止,我有以下代码:

import csv
from textblob_de import TextBlobDE as TextBlob

data = open('myInputFile.csv', encoding="utf-8").readlines()

blob = TextBlob(str(data))


csv_file = open('myOutputFile.csv', 'w', encoding="utf-8")
csv_writer = csv.writer(csv_file)
# Define the Headers of the CSV
csv_writer.writerow(['Text-ID', 'Tokens])


def numOfWordTokens(document):

    myList = []

    for eachRow in document:
        myList.append(eachRow)
        return "\n".join(myList)

        #return eachRow
        #print(eachRow)

        # Count Tokens
        #countTokens = len(wordTokens2.split()) # Output: integer
        #return countTokens
        #myList.append(str(countTokens))


wordTokens = numOfWordTokens(data)

# Write Content in the CSV-Table Rows
csv_writer.writerow([wordTokens])
csv_file.close()

那么,首先我有以下问题?

当我确实返回eachRow时,在Shell中没有任何输出,而在新创建的CSV文件中只有1.行作为输出。 当我打印(eachRow)时,实际上在Shell中将每一行打印为Output,但是我新创建的CSV文件只是空的!

所以这是我遇到的第一部分,因此我无法继续去实际计算每一行中的令牌并将令牌数量写入新CSV文件的部分。

1 个答案:

答案 0 :(得分:0)

用熊猫超级简单,但是如果您不想使用其他模块,那也很好:) 我已经为两个熊猫以及手动遍历数据添加了代码:

import pandas as pd
import csv


def main_pandas(path_to_csv: str, target_path: str):
    df = pd.read_csv(path_to_csv, encoding='utf-8')
    df['tokens'] = df['Content'].apply(lambda x: len(x.split()))
    sub_df = df[['ID', 'tokens']]
    sub_df.to_csv(target_path, index=False)


def main_manual(path_to_csv: str, target_path: str):
    with open(path_to_csv, 'r') as r_fp:
        csv_reader = csv.reader(r_fp)
        next(csv_reader)  # Skip headers
        with open(target_path, 'w') as w_fp:
            csv_writer = csv.writer(w_fp)
            csv_writer.writerow(['Text ID', 'tokens'])  # Write headers
            for line in csv_reader:
                text_id, text_content = line
                csv_writer.writerow([text_id, len(text_content.split())])


if __name__ == '__main__':
    main_manual('text.csv', 'tokens.csv')