此问题在此处已有答案:
Python read csv - BOM embedded into the first key(2个答案)
8天前关闭
也许你可以帮我解决问题。我运行这段代码来读取一个.csv
文件,并使用一个.txt
示例字母来为.csv
文件的每一行生成一个.txt
文件。我根据.csv
文件的Institution
列命名每个文件。
import csv
import os
# Define the path to the directory where you want to save the files
directory_path = r'C:\Users'
# Set the current working directory to the specified path
os.chdir(directory_path)
# Define the CSV and sample text file names
csv_file = "sample.csv"
sample_text_file = "sample_template.txt"
# Read the CSV file
with open(csv_file, 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
data = list(csv_reader)
# Read the sample text template
with open(sample_text_file, 'r') as template_file:
template_text = template_file.read()
# Define the placeholders without delimiters
placeholders = ["Position", "Platform", "Institution", "Optional Paragraph"]
# Process each row from the CSV
for row in data:
# Create a copy of the template text for this row
modified_text = template_text
# Replace placeholders with values from the CSV
for placeholder in placeholders:
value = row.get(placeholder, '')
modified_text = modified_text.replace(f'"{placeholder}"', value)
# Get the name for the output file from "Institution" column
output_file_name = f"{row['Institution']}.txt"
# Write the modified text to the output file
with open(output_file_name, 'w') as output_file:
output_file.write(modified_text)
print(f"File '{output_file_name}' has been created.")
print("All files have been generated in the specified directory.")
字符串.txt
文件被写入导出到latex,看起来像这样:
\begin{document}
%----------------------------------------------------------------------------------------
% FIRST PAGE HEADER
%----------------------------------------------------------------------------------------
\vspace{-1em} % Pull the rule closer to the logo
\rule{\linewidth}{1pt} % Horizontal rule
\bigskip\bigskip % Vertical whitespace
%----------------------------------------------------------------------------------------
% YOUR NAME AND CONTACT INFORMATION
%----------------------------------------------------------------------------------------
\hfill
\begin{tabular}{l @{}}
\today \bigskip\\ % Date
NAME \\
INSTITUTION \\
A1 \\ % Address
A2 \\
\end{tabular}
Dear Members of the Recruiting Committee,
\bigskip % Vertical whitespace
%----------------------------------------------------------------------------------------
% LETTER CONTENT
%----------------------------------------------------------------------------------------
I am writing to apply for the "Position" position that you have advertised on "Platform".
I believe the skills and competencies I hold would be of great value to the "Institution".
"Optional Paragraph"
Thank you for your time and consideration.
\bigskip % Vertical whitespace
Sincerely yours,
\vspace{50pt} % Vertical whitespace
\includegraphics[width=0.2\textwidth]{signature.png}
NAME
\end{document}
型
示例.csv
看起来像这样:
Position,Platform,Institution,Optional Paragraph
Waiter,Facebook,Company A ,
Coder,Twitter,Company B,I am cool.
型
我的问题是,这给了我公司A以下结果:
I am writing to apply for the position that you have advertised on Facebook.
I believe the skills and competencies I hold would be of great value to the Company A .
型
正如你所看到的,Position
列不能被我的代码识别。我想知道你是否知道是什么导致了这一点?
1条答案
按热度按时间yhived7q1#
我相信你的CSV文件中有一个BOM(字节顺序标记),比如:
字符串
它看起来像:
型
当DictReader获取该基础文件并读取第一行作为字段名时,BOM将作为第一个列名的一部分读取:
所以
'Position' != '\ufeffPosition'
,这就是为什么get(fieldname,'')返回空字符串。尝试上面的代码,打印字段名,如果你看到
\ufeff
,用encoding='utf-8-sig'
打开文件: