我是python的初学者。
我需要将列表转换为具有特殊要求的CSV文件。
我有一个这样的清单:
protected void savesubmit_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Khayati;Integrated Security=True");
string qu = string.Format("insert into Ordertb (nokar,modeledokht,tozihat,username) values('{0}','{1}',N'{2}', '{3}')", DropDownList1.Text, DropDownList2.Text, tozihtxt.Text, Convert.ToString(Session["username1"]));
SqlDataAdapter da = new SqlDataAdapter(qu, con);
DataSet ds = new DataSet();
da.Fill(ds, "ordertbl");
}
我希望将其写入(导出)到ONE csv文件。我的意思是,像这样:
text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]
我做了什么? 首先,我将列表放入数据框,然后将其写入csv_file:
text1 CIF BILL
48752614P 87451,45
text2 CLIENT MONEY HOUSE
JOHN 450 2541
text3 NAME CIF
MERY [47852361N, 4587563O]
所以,我的问题是我想只在一个CSV文件中写下所有这些文件。
我想:
text_files = [text1, text2, text3]
df_results = []
for file in text_files:
df_results = pd.DataFrame(file)
df_results = df_results.T
df_results.to_csv((str(file) + '.csv'), sep=';', encoding='utf-8', index=False, quotechar=' ', header=False)
我一直在寻找,但我找不到如何解决这个问题。
谢谢,
MARCUS
答案 0 :(得分:1)
这就是你要找的 -
import pandas as pd
text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]
col_num = max([len(text) for text in texts])
texts = [text1,text2,text3]
for text in texts:
if len(text) < col_num:
text.extend([(None,None)*(col_num-len(text))])
col_values = [[] for i in range(col_num)]
[col_values[i].extend([text[i][0],text[i][1]]) for text in texts for i in range(len(text))]
df = pd.DataFrame(col_values).T
df.fillna('')
df.index = ['text1','text1','text2','text2','text3','text3']
df.to_csv('output.csv')
答案 1 :(得分:1)
正如我在评论中建议的那样,您不需要数据帧。 更新了;并且在复制后跳过第一列。
text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]
with open("output.csv", "w") as f:
for ind, item in enumerate([text1,text2,text3]):
for ind2, subitem in enumerate(item):
if ind2 == 0:
outstring = "text{};{}".format(str(ind+1),(';'.join([str(i) for i in subitem])))
else:
outstring = ";{}".format((';'.join([str(i) for i in subitem])))
f.write(outstring)
print(outstring)
输出:
text1;CIF;48752614P
;BILL;87451,45
text2;CLIENT;JOHN
;MONEY;450
;HOUSE;2541
text3;NAME;MERY
;CIF;['47852361N', '4587563O']
答案 2 :(得分:1)
要将数据组织到所需的结构中,需要完成两个步骤:
1)通过索引将每个教学列表压缩 - 将[(a,b),(a&#39;,b&#39;)]转换为[(a,a&#39;),(b,b&#39;) ] - 代码中的第一行。
2)迭代所有列表(在原始问题[text1,text2,text3]中)并将所有压缩的tupels作为一个平面列表及其相关的原始文本索引。代码中的第二行。
这使得将数据放入数据框并导出简单。第三和第四行代码。
one_text = lambda text: [x for x in zip(*text)]
data_for_df = [ [i] + list(text) for i in range(0, len(all_texts)) for text in one_text(all_texts[i])]
df = pd.DataFrame(data_for_df, columns=['text_name', 'col1', 'col2'])
df.to_csv(target_file)